From 1c0dbc907ad8a5d9f9c3ec16306d6b9bbb8b3c5b Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Thu, 27 May 2021 16:13:06 -0400 Subject: [PATCH] Recast all uses of resist-class and device class in routines using code from extflat from type unsigned long to type TileTypeBitMask. This increases the number of types of each to 256 and tracks the number of types, so it should be difficult to exceed this amount. --- ext2sim/ext2sim.c | 36 ++++++++++++++-------------- ext2spice/ext2hier.c | 8 +++---- ext2spice/ext2spice.c | 56 +++++++++++++++++++++---------------------- ext2spice/ext2spice.h | 26 +++++++------------- extflat/EFantenna.c | 18 +++++++------- extflat/EFbuild.c | 4 ++-- extflat/extflat.h | 3 --- resis/ResRex.c | 4 ++-- 8 files changed, 71 insertions(+), 84 deletions(-) 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);