diff --git a/ext2sim/ext2sim.c b/ext2sim/ext2sim.c index ce0ad59b..9ef866c8 100644 --- a/ext2sim/ext2sim.c +++ b/ext2sim/ext2sim.c @@ -97,39 +97,39 @@ struct { short resClassSub ; /* The resistance class of the substrate of the dev */ TileType devType ; /* Magic tile type of the device */ char *defSubs ; /* The default substrate node */ -} fetInfo[MAXDEVTYPES]; +} fetInfo[TT_MAXTYPES]; typedef struct { - long visitMask:MAXDEVTYPES; + TileTypeBitMask visitMask; } nodeClient; typedef struct { HierName *lastPrefix; - long visitMask:MAXDEVTYPES; + TileTypeBitMask visitMask; } nodeClientHier; #define NO_RESCLASS -1 #define markVisited(client, rclass) \ - { (client)->visitMask |= (1<visitMask), rclass); } #define clearVisited(client) \ - { (client)->visitMask = (long)0; } + { TTMaskZero(&((client)->visitMask)); } #define beenVisited(client, rclass) \ - ( (client)->visitMask & (1<visitMask), rclass) ) #define initNodeClient(node) \ { \ (node)->efnode_client = (ClientData) mallocMagic((unsigned) (sizeof(nodeClient))); \ - (( nodeClient *)(node)->efnode_client)->visitMask = (long) 0; \ + TTMaskZero(&(( nodeClient *)(node)->efnode_client)->visitMask); \ } #define initNodeClientHier(node) \ { \ (node)->efnode_client = (ClientData) mallocMagic((unsigned) (sizeof(nodeClientHier))); \ - ((nodeClientHier *) (node)->efnode_client)->visitMask = (long) 0; \ + TTMaskZero(&(( nodeClientHier *)(node)->efnode_client)->visitMask); \ } @@ -572,7 +572,7 @@ runexttosim: /* create default fetinfo entries (MOSIS) which can be overriden by the command line arguments */ - for ( i = 0 ; i < MAXDEVTYPES ; i++ ) + for ( i = 0 ; i < TT_MAXTYPES ; i++ ) { fetInfo[i].resClassSource = NO_RESCLASS; fetInfo[i].resClassDrain = NO_RESCLASS; @@ -589,12 +589,12 @@ runexttosim: while (ExtGetDevInfo(idx++, &devname, &devtype, &s_rclass, &d_rclass, &sub_rclass, &subname)) { - if (idx == MAXDEVTYPES) + if (idx == TT_MAXTYPES) { TxError("Error: Ran out of space for device types!\n"); break; } - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, devname); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, devname); if (EFStyle != NULL) { @@ -676,26 +676,26 @@ main(argc, argv) EFInit(); /* create default fetinfo entries (MOSIS) which can be overriden by the command line arguments */ - for ( i = 0 ; i < MAXDEVTYPES ; i++ ) { + for ( i = 0 ; i < TT_MAXTYPES ; i++ ) { fetInfo[i].resClassSource = NO_RESCLASS; fetInfo[i].resClassDrain = NO_RESCLASS; fetInfo[i].resClassSub = NO_RESCLASS; fetInfo[i].defSubs = NULL; fetInfo[i].devType = TT_SPACE; } - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "nfet"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "nfet"); fetInfo[i].resClassSource = fetInfo[i].resClassDrain = 0 ; fetInfo[i].resClassSub = NO_RESCLASS ; fetInfo[i].defSubs = "Gnd!"; - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "pfet"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "pfet"); fetInfo[i].resClassSource = fetInfo[i].resClassDrain = 1 ; fetInfo[i].resClassSub = 6 ; fetInfo[i].defSubs = "Vdd!"; - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "nmos"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "nmos"); fetInfo[i].resClassSource = fetInfo[i].resClassDrain = 0 ; fetInfo[i].resClassSub = NO_RESCLASS ; fetInfo[i].defSubs = "Gnd!"; - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "pmos"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "pmos"); fetInfo[i].resClassSource = fetInfo[i].resClassDrain = 1 ; fetInfo[i].resClassSub = 6 ; fetInfo[i].defSubs = "Vdd!"; @@ -896,7 +896,7 @@ simmainArgs(pargc, pargv) rClassSub = NO_RESCLASS ; if ( sscanf(rp, "%d/%s", &rClass, subsNode) != 2 ) goto usage; } - ndx = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, cp); + ndx = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, cp); fetInfo[ndx].resClassSource = rClass; fetInfo[ndx].resClassDrain = rClass; fetInfo[ndx].resClassSub = rClassSub; @@ -1402,7 +1402,7 @@ bool simnAPHier(dterm, hierName, resClass, scale, outf) initNodeClientHier(node); nc = (nodeClientHier *)node->efnode_client; if ( nc->lastPrefix != hierName ) { - nc->visitMask = 0; + TTMaskZero(&(nc->visitMask)); nc->lastPrefix = hierName; } if ( resClass == NO_RESCLASS || diff --git a/ext2spice/ext2hier.c b/ext2spice/ext2hier.c index 2373bb7b..717dadc9 100644 --- a/ext2spice/ext2hier.c +++ b/ext2spice/ext2hier.c @@ -1264,10 +1264,10 @@ spcnodeHierVisit(hc, node, res, cap) if (node->efnode_client) { - isConnected = (esDistrJunct) ? - (((nodeClient *)node->efnode_client)->m_w.widths != NULL) : - ((((nodeClient *)node->efnode_client)->m_w.visitMask - & DEV_CONNECT_MASK) != 0); + if (esDistrJunct) + isConnected = (((nodeClient *)node->efnode_client)->m_w.widths != NULL); + else + isConnected = !TTMaskIsZero(&((nodeClient *)node->efnode_client)->m_w.visitMask); } if (!isConnected && esDevNodesOnly) return 0; diff --git a/ext2spice/ext2spice.c b/ext2spice/ext2spice.c index 1cba8f8d..bd7aaf81 100644 --- a/ext2spice/ext2spice.c +++ b/ext2spice/ext2spice.c @@ -79,7 +79,7 @@ int esNoModelType; /* index for device type "None" (model-less device) */ HashTable subcktNameTable ; /* the hash table itself */ DQueue subcktNameQueue ; /* q used to print it sorted at the end*/ -fetInfoList esFetInfo[MAXDEVTYPES]; +fetInfoList esFetInfo[TT_MAXTYPES]; /* Record for keeping a list of global names */ @@ -90,7 +90,7 @@ typedef struct GLL { char *gll_name; } globalList; -unsigned long initMask = 0; +TileTypeBitMask initMask; /* Used for device types, not tile types */ bool esMergeDevsA = FALSE; /* aggressive merging of devs L1=L2 merge them */ bool esMergeDevsC = FALSE; /* conservative merging of devs L1=L2 and W1=W2 */ @@ -728,7 +728,7 @@ runexttospice: /* create default devinfo entries (MOSIS) which can be overridden by the command line arguments */ - for ( i = 0 ; i < MAXDEVTYPES ; i++ ) { + for ( i = 0 ; i < TT_MAXTYPES ; i++ ) { esFetInfo[i].resClassSource = NO_RESCLASS; esFetInfo[i].resClassDrain = NO_RESCLASS; esFetInfo[i].resClassSub = NO_RESCLASS; @@ -743,12 +743,12 @@ runexttospice: while (ExtGetDevInfo(idx++, &devname, &devtype, &s_rclass, &d_rclass, &sub_rclass, &subname)) { - if (idx == MAXDEVTYPES) + if (idx == TT_MAXTYPES) { TxError("Error: Ran out of space for device types!\n"); break; } - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, devname); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, devname); if (!strcmp(devname, "None")) esNoModelType = i; if (EFStyle != NULL) @@ -908,7 +908,9 @@ runexttospice: if (!esDoPorts) EFVisitSubcircuits(subcktUndef, (ClientData) NULL); - initMask = ( esDistrJunct ) ? (unsigned long)0 : DEV_CONNECT_MASK; + TTMaskZero(&initMask); + if (!esDistrJunct) + TTMaskCom(&initMask); if (esMergeDevsA || esMergeDevsC) { @@ -924,7 +926,7 @@ runexttospice: else if (esDistrJunct) EFVisitDevs(devDistJunctVisit, (ClientData) NULL); EFVisitDevs(spcdevVisit, (ClientData) NULL); - initMask = (unsigned long) 0; + TTMaskZero(&initMask); if (flatFlags & EF_FLATCAPS) { (void) sprintf( esSpiceCapFormat, "C%%d %%s %%s %%.%dlffF\n", @@ -994,25 +996,25 @@ main(argc, argv) EFResistThreshold = INFINITE_THRESHOLD ; /* create default devinfo entries (MOSIS) which can be overriden by the command line arguments */ - for ( i = 0 ; i < MAXDEVTYPES ; i++ ) { + for ( i = 0 ; i < TT_MAXTYPES ; i++ ) { esFetInfo[i].resClassSource = NO_RESCLASS; esFetInfo[i].resClassDrain = NO_RESCLASS; esFetInfo[i].resClassSub = NO_RESCLASS; esFetInfo[i].defSubs = NULL; } - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "ndev"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "ndev"); esFetInfo[i].resClassSource = esFetInfo[i].resClassDrain = 0 ; esFetInfo[i].resClassSub = NO_RESCLASS ; esFetInfo[i].defSubs = "Gnd!"; - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "pdev"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "pdev"); esFetInfo[i].resClassSource = esFetInfo[i].resClassDrain = 1 ; esFetInfo[i].resClassSub = 8 ; esFetInfo[i].defSubs = "Vdd!"; - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "nmos"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "nmos"); esFetInfo[i].resClassSource = esFetInfo[i].resClassDrain = 0 ; esFetInfo[i].resClassSub = NO_RESCLASS ; esFetInfo[i].defSubs = "Gnd!"; - i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, "pmos"); + i = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, "pmos"); esFetInfo[i].resClassSource = esFetInfo[i].resClassDrain = 1 ; esFetInfo[i].resClassSub = 8 ; esFetInfo[i].defSubs = "Vdd!"; @@ -1078,7 +1080,9 @@ main(argc, argv) if (!esDoPorts) EFVisitSubcircuits(subcktUndef, (ClientData) NULL); - initMask = ( esDistrJunct ) ? (unsigned long)0 : DEV_CONNECT_MASK ; + TTMaskZero(&initMask); + if (!esDistrJunct) + TTMaskCom(&initMask); if ( esMergeDevsA || esMergeDevsC ) { EFVisitDevs(devMergeVisit, (ClientData) NULL); @@ -1092,7 +1096,7 @@ main(argc, argv) } else if ( esDistrJunct ) EFVisitDevs(devDistJunctVisit, (ClientData) NULL); EFVisitDevs(spcdevVisit, (ClientData) NULL); - initMask = (unsigned long) 0; + TTMaskZero(&initMask); if (flatFlags & EF_FLATCAPS) { (void) sprintf( esSpiceCapFormat, "C%%d %%s %%s %%.%dlffF\n",esCapAccuracy); EFVisitCaps(spccapVisit, (ClientData) NULL); @@ -1240,17 +1244,9 @@ spcmainArgs(pargc, pargv) rClassSub = -1 ; if ( sscanf(rp, "%d/%s", &rClass, subsNode) != 2 ) goto usage; } - ndx = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, cp); + ndx = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, cp); esFetInfo[ndx].resClassSource = esFetInfo[ndx].resClassDrain = rClass; esFetInfo[ndx].resClassSub = rClassSub; - if ( ((1<efnn_node); if (!esDistrJunct) - ((nodeClient *)nn->efnn_node->efnode_client)->m_w.visitMask |= - DEV_CONNECT_MASK; + { + TTMaskZero(&((nodeClient *)nn->efnn_node->efnode_client)->m_w.visitMask); + TTMaskCom(&((nodeClient *)nn->efnn_node->efnode_client)->m_w.visitMask); + } return nn->efnn_node; } } @@ -3126,7 +3124,10 @@ spcdevOutNode(prefix, suffix, name, outf) /* Mark node as visited */ if (!esDistrJunct) - ((nodeClient *)nn->efnn_node->efnode_client)->m_w.visitMask |= DEV_CONNECT_MASK; + { + TTMaskZero(&((nodeClient *)nn->efnn_node->efnode_client)->m_w.visitMask); + TTMaskCom(&((nodeClient *)nn->efnn_node->efnode_client)->m_w.visitMask); + } return (1 + strlen(nname)); } @@ -3279,8 +3280,7 @@ spcnodeVisit(node, res, cap) { isConnected = (esDistrJunct) ? (((nodeClient *)node->efnode_client)->m_w.widths != NULL) : - ((((nodeClient *)node->efnode_client)->m_w.visitMask - & DEV_CONNECT_MASK) != 0); + (!TTMaskIsZero(&((nodeClient *)node->efnode_client)->m_w.visitMask)); } if (!isConnected && esDevNodesOnly) return 0; diff --git a/ext2spice/ext2spice.h b/ext2spice/ext2spice.h index e21e6acd..ea423a51 100644 --- a/ext2spice/ext2spice.h +++ b/ext2spice/ext2spice.h @@ -60,7 +60,7 @@ extern FILE *esSpiceF; extern float esScale; /* negative if hspice the EFScale/100 otherwise */ extern unsigned short esFormat; -extern unsigned long initMask; +extern TileTypeBitMask initMask; extern int esCapNum, esDevNum, esResNum, esDiodeNum; extern int esNodeNum; /* just in case we're extracting spice2 */ @@ -96,19 +96,15 @@ typedef struct { char *defSubs ; /* the default substrate node */ } fetInfoList; -extern fetInfoList esFetInfo[MAXDEVTYPES]; +extern fetInfoList esFetInfo[TT_MAXTYPES]; #define MAX_STR_SIZE (1<<11) /* 2K should be enough for keeping temp names even of the most complicated design */ /* Node clients for figuring out areas and perimeters of sources and drains */ -typedef struct { - long _duml:MAXDEVTYPES; -} _dum; /* if you get an error here you should change - the data structures and visitMask */ typedef union { - long visitMask; /* mask for normal visits */ + TileTypeBitMask visitMask; /* mask for normal visits */ float *widths; /* width used for distributing area perim */ } maskOrWidth ; @@ -125,32 +121,26 @@ typedef struct { #define NO_RESCLASS -1 #define markVisited(client, rclass) \ - { (client)->m_w.visitMask |= (1<m_w.visitMask), rclass); } #define clearVisited(client) \ - { (client)->m_w.visitMask = (long)0; } + { TTMaskZero(&((client)->m_w.visitMask)); } #define beenVisited(client, rclass) \ - ( (client)->m_w.visitMask & (1<m_w.visitMask), rclass) ) #define initNodeClient(node) \ { \ (node)->efnode_client = (ClientData) mallocMagic((unsigned) (sizeof(nodeClient))); \ (( nodeClient *)(node)->efnode_client)->spiceNodeName = NULL; \ - (( nodeClient *)(node)->efnode_client)->m_w.visitMask = (unsigned long)initMask; \ + TTMaskSetMask(&(((nodeClient *)(node)->efnode_client)->m_w.visitMask), &initMask);\ } #define initNodeClientHier(node) \ { \ (node)->efnode_client = (ClientData) mallocMagic((unsigned)(sizeof(nodeClientHier))); \ - ((nodeClientHier *) (node)->efnode_client)->m_w.visitMask = (unsigned long) 0; \ + TTMaskZero (&((nodeClientHier *) (node)->efnode_client)->m_w.visitMask); \ } diff --git a/extflat/EFantenna.c b/extflat/EFantenna.c index d6e3f500..63d94493 100644 --- a/extflat/EFantenna.c +++ b/extflat/EFantenna.c @@ -42,36 +42,36 @@ int antennacheckArgs(); int antennacheckVisit(); typedef struct { - long visitMask:MAXDEVTYPES; + TileTypeBitMask visitMask; } nodeClient; typedef struct { HierName *lastPrefix; - long visitMask:MAXDEVTYPES; + TileTypeBitMask visitMask; } nodeClientHier; #define NO_RESCLASS -1 #define markVisited(client, rclass) \ - { (client)->visitMask |= (1<visitMask), rclass); } #define clearVisited(client) \ - { (client)->visitMask = (long)0; } + { TTMaskZero(&((client)->visitMask); } #define beenVisited(client, rclass) \ - ( (client)->visitMask & (1<visitMask), rclass) ) #define initNodeClient(node) \ { \ (node)->efnode_client = (ClientData) mallocMagic((unsigned) (sizeof(nodeClient))); \ - (( nodeClient *)(node)->efnode_client)->visitMask = (long) 0; \ + TTMaskZero(&(( nodeClient *)(node)->efnode_client)->visitMask); \ } #define initNodeClientHier(node) \ { \ (node)->efnode_client = (ClientData) mallocMagic((unsigned) (sizeof(nodeClientHier))); \ - ((nodeClientHier *) (node)->efnode_client)->visitMask = (long) 0; \ + TTMaskZero(&(( nodeClientHier *)(node)->efnode_client)->visitMask); \ } /* Diagnostic */ @@ -232,12 +232,12 @@ runantennacheck: idx = 0; while (ExtGetDevInfo(idx++, &devname, NULL, NULL, NULL, NULL, NULL)) { - if (idx == MAXDEVTYPES) + if (idx == TT_MAXTYPES) { TxError("Error: Ran out of space for device types!\n"); break; } - efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, devname); + efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, devname); } /* Build device lookup table */ diff --git a/extflat/EFbuild.c b/extflat/EFbuild.c index 21db87ab..07d59fdd 100644 --- a/extflat/EFbuild.c +++ b/extflat/EFbuild.c @@ -49,7 +49,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header$"; #define MAXTYPES 100 /* Table of transistor types */ -char *EFDevTypes[MAXDEVTYPES]; +char *EFDevTypes[TT_MAXTYPES]; int EFDevNumTypes; /* Table of Magic layers */ @@ -802,7 +802,7 @@ efBuildDevice(def, class, type, r, argc, argv) nterminals = (argc - argstart) / 3; - dev_type = efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, type); + dev_type = efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, type); /* Determine if this device has been seen before */ /* NOTE: This is done by tile type, not name, because the extresist diff --git a/extflat/extflat.h b/extflat/extflat.h index a512e7d8..56cc5554 100644 --- a/extflat/extflat.h +++ b/extflat/extflat.h @@ -342,9 +342,6 @@ extern char *EFHNToStr(); extern int EFGetPortMax(); /* ------------------------- constants used by clients -------------- */ -/* This gives us a 32 or 64 dev types which should be ok */ -#define BITSPERCHAR 8 -#define MAXDEVTYPES (sizeof(long)*BITSPERCHAR) /* * ANSI C definitions of arguments to EFvisit procedures diff --git a/resis/ResRex.c b/resis/ResRex.c index ace19b58..f2d99a51 100644 --- a/resis/ResRex.c +++ b/resis/ResRex.c @@ -109,12 +109,12 @@ ExtResisForDef(celldef, resisdata) idx = 0; while (ExtGetDevInfo(idx++, &devname, NULL, NULL, NULL, NULL, NULL)) { - if (idx == MAXDEVTYPES) + if (idx == TT_MAXTYPES) { TxError("Error: Ran out of space for device types!\n"); break; } - efBuildAddStr(EFDevTypes, &EFDevNumTypes, MAXDEVTYPES, devname); + efBuildAddStr(EFDevTypes, &EFDevNumTypes, TT_MAXTYPES, devname); } HashInit(&ResNodeTable, INITFLATSIZE, HT_STRINGKEYS);