Added another option to the "extresist" command, this one to include

specific nets to extract, rather than excluding them.  That allows
"extresist" to target specific nets like the power supply or a clock
tree for extraction.
This commit is contained in:
Tim Edwards 2021-10-04 15:32:37 -04:00
parent 98a631144c
commit 52a424e511
2 changed files with 47 additions and 7 deletions

View File

@ -1 +1 @@
8.3.212
8.3.213

View File

@ -44,7 +44,11 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
/* Table of nodes to ignore (manually specified) */
HashTable ResIgnoreTable; /* Hash table of nodes to ignore */
HashTable ResIgnoreTable; /* Hash table of nodes to ignore */
/* Table of nodes to include (manually specified) */
HashTable ResIncludeTable; /* Hash table of nodes to include */
/* ResSimNode is a node read in from a sim file */
@ -234,6 +238,7 @@ CmdExtResis(win, cmd)
"silent [on/off] turn on/off printing of net statistics",
"skip mask don't extract these types",
"ignore names don't extract these nets",
"include names extract only these nets",
"box type extract the signal under the box on layer type",
"cell cellname extract the network for the cell named cellname",
"blackbox [on/off] treat subcircuits with ports as black boxes",
@ -248,8 +253,8 @@ CmdExtResis(win, cmd)
typedef enum {
RES_BAD=-2, RES_AMBIG, RES_TOL,
RES_ALL, RES_SIMP, RES_EXTOUT, RES_LUMPED,
RES_SILENT, RES_SKIP, RES_IGNORE, RES_BOX, RES_CELL,
RES_ALL, RES_SIMP, RES_EXTOUT, RES_LUMPED, RES_SILENT,
RES_SKIP, RES_IGNORE, RES_INCLUDE, RES_BOX, RES_CELL,
RES_BLACKBOX, RES_FASTHENRY, RES_GEOMETRY, RES_HELP,
#ifdef LAPLACE
RES_LAPLACE,
@ -268,6 +273,7 @@ typedef enum {
tdiTolerance = 1;
fhFrequency = 10e6; /* 10 MHz default */
HashInit(&ResIgnoreTable, INITFLATSIZE, HT_STRINGKEYS);
HashInit(&ResIncludeTable, INITFLATSIZE, HT_STRINGKEYS);
init = 0;
}
@ -484,6 +490,31 @@ typedef enum {
}
return;
case RES_INCLUDE:
if (cmd->tx_argc > 2)
{
if (!strcasecmp(cmd->tx_argv[2], "all"))
{
/* Kill and reinitialize the table of ignored nets */
HashKill(&ResIncludeTable);
HashInit(&ResIncludeTable, INITFLATSIZE, HT_STRINGKEYS);
}
else
HashFind(&ResIncludeTable, cmd->tx_argv[2]);
}
else
{
HashSearch hs;
HashEntry *entry;
/* List all net names that are being included */
HashStartSearch(&hs);
while((entry = HashNext(&ResIncludeTable, &hs)) != NULL)
TxPrintf("%s ", (char *)entry->h_key.h_name);
TxPrintf("\n");
}
return;
case RES_HELP:
for (i = 0; cmdExtresisCmd[i] != NULL; i++)
TxPrintf("%s\n", cmdExtresisCmd[i]);
@ -953,9 +984,18 @@ ResCheckSimNodes(celldef, resisdata)
{
HashEntry *he;
/* Ignore specified nodes */
he = HashLookOnly(&ResIgnoreTable, node->name);
if (he != NULL) continue;
/* Ignore or include specified nodes */
if (ResIncludeTable.ht_nEntries > 0)
{
he = HashLookOnly(&ResIncludeTable, node->name);
if (he == NULL) continue;
}
else
{
he = HashLookOnly(&ResIgnoreTable, node->name);
if (he != NULL) continue;
}
/* Has this node been merged away or is it marked as skipped? */
/* If so, skip it */