* sim/ucsim/cmd.src/cmdutil.cc: NUL device is detected as CG_FILE type
[fw/sdcc] / src / pic16 / device.h
index ec12138bba0294993d903d4f75972bc45fff45dd..fd06fc4bd6fca46917da5347d7f894bb3a11b3a8 100644 (file)
 #ifndef  __DEVICE_H__
 #define  __DEVICE_H__
 
-/* memRange - a structure to define a range of valid memory addresses 
- * 
- * The Memory of most PICs (and other micros) is a collection of
- * disjoint chunks. The memRange structure will define the start
- * and end address of one of these chunks. The memory map of a
- * particular device is a collection of memRange struct's.
- */
-
-typedef struct memRange {
-  int start_address;      /* first address in range */
-  int end_address;        /* last */
-  int alias;              /* bit mask defining how/if memory range is aliased 
-                          * e.g. alias = 0x80 means start_address is identical
-                          * to the memory location at (0x80 | start_address) */
-  int bank;               /* PIC memory bank this range occupies */
-
-} memRange;
-
-/* AssignedMemory - A structure to keep track of the memory that has been used.
- *
- * When a register gets assigned an address this struct is used to
- * keep track of a few details about the register. There is one of
- * these structures for each memory location in the device.
- */
-
-typedef struct AssignedMemory {
-  regs *reg;        /* Pointer to the register (NULL if this is an invalid address) */
-  int  instance;    /* the i'th byte of a multibyte register */
-  int  alias;       /* Bit mapping of aliased addresses (see memRange) */
-  int  bank;        /* Memory bank of this register */
-  int  isValid:1;   /* True if the address is legal */
-  int  isSFR:1;     /* True if the address is that of a Special Function reg */
-  int  isEmitted:1; /* True if the register has been written to a cBlock */
-
-} AssignedMemory;
-
-
-/*
- * pic16_finalMapping - Dynamically allocated array that records the register assignments
- */
-
-extern AssignedMemory *pic16_finalMapping;
-
-/*
- * pic16_finalMappingSize - Size of register assignments that pic16_finalMapping can hold
- */
-
-extern int pic16_finalMappingSize;
+#define CONFIGURATION_WORDS    20
+#define IDLOCATION_BYTES       20
+
+typedef struct {
+       int sfrLoAddr;
+       int sfrHiAddr;
+} sfrRangeInfo_t;
+       
+
+typedef struct {
+       unsigned int mask;
+       int emit;
+       unsigned int value;
+} configRegInfo_t;
+
+typedef struct {
+       int confAddrStart;      /* starting address */
+       int confAddrEnd;        /* ending address */
+       configRegInfo_t crInfo[ CONFIGURATION_WORDS ];
+} configWordsInfo_t;
+
+typedef struct {
+       unsigned char emit;
+       unsigned char value;
+} idRegInfo_t;
+
+typedef struct {
+       int idAddrStart;        /* starting ID address */
+       int idAddrEnd;          /* ending ID address */
+       idRegInfo_t irInfo[ IDLOCATION_BYTES ];
+} idBytesInfo_t;
 
 
 #define PROCESSOR_NAMES    4
 /* Processor unique attributes */
-typedef struct PIC_device {
+typedef struct PIC16_device {
   char *name[PROCESSOR_NAMES];/* aliases for the processor name */
 
-  memRange *ram;              /* RAM memory map */
-  memRange *sfr;              /* SFR memory map */
-
-  int maxRAMaddress;          /* maximum value for a data address */
-  int bankMask;               /* Bitmask that is ANDed with address to extract banking bits */
-  int RAMsize;               /* size of Data RAM - VR 031120 */
-  int extMIface;               /* device has external memory interface */
-} PIC_device;
+  int maxRAMaddress;           /* maximum value for a data address */
+  int RAMsize;                 /* size of Data RAM - VR 031120 */
+  int acsSplitOfs;             /* access bank split offset */
+  int extMIface;               /* device has external memory interface */
+  sfrRangeInfo_t sfrRange;     /* SFR range */
+  configWordsInfo_t cwInfo;    /* configuration words info */
+  idBytesInfo_t idInfo;                /* ID Locations info */
+} PIC16_device;
 
 /* Given a pointer to a register, this macro returns the bank that it is in */
 #define REG_ADDR(r)        ((r)->isBitField ? (((r)->address)>>3) : (r)->address)
-#define REG_BANK(r)        (pic16_finalMapping[REG_ADDR(r)].bank)
-#define REG_isALIASED(r)   (pic16_finalMapping[REG_ADDR(r)].alias != 0)
-#define REG_isVALID(r)     (pic16_finalMapping[REG_ADDR(r)].isValid)
 
+#define OF_LR_SUPPORT          0x00000001
+#define OF_OPTIMIZE_GOTO       0x00000002
+#define OF_OPTIMIZE_CMP                0x00000004
+#define OF_OPTIMIZE_DF         0x00000008
+
+typedef struct {
+  int no_banksel;
+  int opt_banksel;
+  int omit_configw;
+  int omit_ivt;
+  int leave_reset;
+  int stack_model;
+  int ivt_loc;
+  int nodefaultlibs;
+  int dumpcalltree;
+  char *crt_name;
+  int no_crt;
+  int ip_stack;
+  unsigned long opt_flags;
+  int gstack;
+  unsigned int debgen;
+  int CATregs;
+} pic16_options_t;
+
+extern int xinst;
+
+#define STACK_MODEL_SMALL      (pic16_options.stack_model == 0)
+#define STACK_MODEL_LARGE      (pic16_options.stack_model == 1)
+
+extern set *fix_idataSymSet;
+extern set *rel_idataSymSet;
+
+#if 0
+/* This is an experimental code for #pragma inline
+   and is temporarily disabled for 2.5.0 release */
+extern set *asmInlineMap;
+#endif  /* 0 */
+
+typedef struct {
+  unsigned long isize;
+  unsigned long adsize;
+  unsigned long udsize;
+  unsigned long idsize;
+  unsigned long intsize;
+} stats_t;
+
+extern stats_t statistics;
+
+extern pic16_options_t pic16_options;
+extern PIC16_device *pic16;
 
 /****************************************/
-void pic16_assignConfigWordValue(int address, int value);
-int pic16_getConfigWord(int address);
+void pic16_assignConfigWordValue(int address, unsigned int value);
+void pic16_assignIdByteValue(int address, char value);
 int pic16_isREGinBank(regs *reg, int bank);
 int pic16_REGallBanks(regs *reg);
-void pic16_addMemRange(memRange *r, int type);
 void pic16_setMaxRAM(int size);
+int PIC16_IS_CONFIG_ADDRESS(int address);
+int PIC16_IS_IDLOC_ADDRESS(int address);
+int PIC16_IS_HWREG_ADDRESS(int address);
+
+int checkAddReg(set **set, regs *reg);
+int checkAddSym(set **set, symbol *reg);
+int checkSym(set *set, symbol *reg);
 
 #endif  /* __DEVICE_H__ */