1 /* 2 * ext2spice.h -- 3 * Definitions for ext2spice.c and ext2hier.c 4 */ 5 6 #ifndef _EXTTOSPICE_H 7 #define _EXTTOSPICE_H 8 9 /* cache list used to find parallel devs */ 10 typedef struct _devMerge { 11 float l, w; 12 EFNode *g, *s, *d, *b; 13 Dev * dev; 14 int esFMIndex; 15 HierName *hierName; 16 struct _devMerge *next; 17 } devMerge; 18 19 /* Forward declarations */ 20 #ifdef MAGIC_WRAPPER 21 void CmdExtToSpice(); 22 #endif 23 extern int spcmainArgs(); 24 extern int spccapVisit(), spcdevVisit(), spcnodeVisit(), subcktVisit(); 25 extern int spcresistVisit(), devMergeVisit(), devDistJunctVisit(); 26 extern int spcsubVisit(); 27 extern int subcktUndef(); 28 extern EFNode *spcdevSubstrate(); 29 extern char *nodeSpiceName(); 30 extern int nodeVisitDebug(); 31 extern void topVisit(); 32 extern void swapDrainSource(); 33 extern int _ext2spice_start(); 34 35 extern EFNode *spcdevHierSubstrate(); 36 extern char *nodeSpiceHierName(); 37 extern devMerge *mkDevMerge(); 38 extern bool extHierSDAttr(); 39 extern int esFreeNodeClient(); 40 41 extern bool devIsKilled(); 42 extern float getCurDevMult(); 43 extern void addDevMult(); 44 extern void setDevMult(); 45 46 /* Options specific to ext2spice */ 47 extern bool esDoExtResis; 48 extern bool esDoPorts; 49 extern bool esDoHierarchy; 50 extern bool esDoBlackBox; 51 extern bool esDoResistorTee; 52 extern int esDoSubckt; 53 extern bool esDevNodesOnly; 54 extern bool esNoAttrs; 55 extern bool esHierAP; 56 extern char spcesDefaultOut[FNSIZE]; 57 extern int esCapAccuracy; 58 extern char esSpiceCapFormat[FNSIZE]; 59 extern char *spcesOutName; 60 extern FILE *esSpiceF; 61 extern float esScale; /* negative if hspice the EFScale/100 otherwise */ 62 63 extern unsigned short esFormat; 64 extern TileTypeBitMask initMask; 65 66 extern int esCapNum, esDevNum, esResNum, esDiodeNum, esVoltNum; 67 extern int esNodeNum; /* just in case we're extracting spice2 */ 68 extern int esSbckNum; /* used in hspice node name shortening */ 69 extern int esNoModelType; /* index for device type "None" (model-less device) */ 70 71 extern bool esMergeDevsA; /* aggressive merging of devs L1=L2 merge them */ 72 extern bool esMergeDevsC; /* conservative merging of devs L1=L2 and W1=W2 */ 73 /* used with the hspice multiplier */ 74 extern bool esDistrJunct; 75 76 extern float *esFMult; /* the array itself */ 77 extern int esFMIndex; /* current index to it */ 78 extern int esFMSize; /* its current size (growable) */ 79 80 extern int esSpiceDevsMerged; 81 extern devMerge *devMergeList; 82 83 /* 84 * The following hash table and associated functions are used only if 85 * the format is hspice, to keep the translation between the hierarchical 86 * prefix of a node and the x num that we use to output valid hspice 87 * which also are meaningful. 88 */ 89 extern HashTable subcktNameTable ; /* the hash table itself */ 90 extern DQueue subcktNameQueue ; /* q used to print it sorted at the end*/ 91 92 93 typedef struct { 94 short resClassSource ; /* the resistance class of the source of the dev */ 95 short resClassDrain ; /* the resistance class of the drain of the dev */ 96 short resClassSub ; /* the resistance class of the substrate of the dev */ 97 char *defSubs ; /* the default substrate node */ 98 } fetInfoList; 99 100 extern fetInfoList esFetInfo[TT_MAXTYPES]; 101 102 #define MAX_STR_SIZE (1<<11) /* 2K should be enough for keeping temp 103 names even of the most complicated design */ 104 105 /* Node clients for figuring out areas and perimeters of sources and drains */ 106 107 typedef union { 108 TileTypeBitMask visitMask; /* mask for normal visits */ 109 float *widths; /* width used for distributing area perim */ 110 } maskOrWidth ; 111 112 typedef struct { 113 char *spiceNodeName; 114 maskOrWidth m_w; 115 } nodeClient; 116 117 typedef struct { 118 HierName *lastPrefix; 119 maskOrWidth m_w; 120 } nodeClientHier; 121 122 #define NO_RESCLASS -1 123 124 #define markVisited(client, rclass) \ 125 { TTMaskSetType(&((client)->m_w.visitMask), rclass); } 126 127 #define clearVisited(client) \ 128 { TTMaskZero(&((client)->m_w.visitMask)); } 129 130 #define beenVisited(client, rclass) \ 131 ( TTMaskHasType(&((client)->m_w.visitMask), rclass) ) 132 133 #define initNodeClient(node) \ 134 { \ 135 (node)->efnode_client = (ClientData) mallocMagic((unsigned) (sizeof(nodeClient))); \ 136 (( nodeClient *)(node)->efnode_client)->spiceNodeName = NULL; \ 137 TTMaskZero (&((nodeClient *) (node)->efnode_client)->m_w.visitMask); \ 138 TTMaskSetMask(&(((nodeClient *)(node)->efnode_client)->m_w.visitMask), &initMask);\ 139 } 140 141 142 #define initNodeClientHier(node) \ 143 { \ 144 (node)->efnode_client = (ClientData) mallocMagic((unsigned)(sizeof(nodeClientHier))); \ 145 TTMaskZero (&((nodeClientHier *) (node)->efnode_client)->m_w.visitMask); \ 146 } 147 148 /* attributes controlling the Area/Perimeter extraction of dev terminals */ 149 #define ATTR_FLATAP "*[Ee][Xx][Tt]:[Aa][Pp][Ff]*" 150 #define ATTR_HIERAP "*[Ee][Xx][Tt]:[Aa][Pp][Hh]*" 151 #define ATTR_SUBSAP "*[Ee][Xx][Tt]:[Aa][Pp][Ss]*" 152 153 #define SPICE2 0 154 #define SPICE3 1 155 #define HSPICE 2 156 #define NGSPICE 3 157 158 #define AUTO 2 /* TRUE | FALSE | AUTO for esDoSubckt */ 159 160 #define NOT_PARALLEL 0 161 #define PARALLEL 1 162 #define ANTIPARALLEL 2 163 164 /* 165 *--------------------------------------------------------- 166 * Variables used for merging parallel devs 167 * The merging of devs is based on the fact that spcdevVisit 168 * visits the devs in the same order all the time so the 169 * value of esFMult[i] keeps the multiplier for the ith dev 170 *--------------------------------------------------------- 171 */ 172 #define DEV_KILLED ((float) -1.0) 173 #define FMULT_SIZE (1<<10) 174 #define DEV_KILLED ((float) -1.0) 175 176 #ifdef MAGIC_WRAPPER 177 #define atoCap(s) ((EFCapValue)atof(s)) 178 #endif 179 180 #endif /* _EXTTOSPICE_H */ 181