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