New command option "model blackbox on|off" makes "readnet spice"
treat empty subcircuits as blackbox cells automatically without requiring specific callse to "model <cell> blackbox" for each. Enabled in LVS script by giving option "-blackbox" at the end of the LVS command.
This commit is contained in:
parent
b6218699a9
commit
05d4225e97
|
|
@ -53,6 +53,8 @@ extern void PortList(char *prefix, char *list_template);
|
|||
extern char *Cell(char *inststr, char *model, ...);
|
||||
extern int IsIgnored(char *, int);
|
||||
|
||||
extern int auto_blackbox; /* For handling empty subcircuits */
|
||||
|
||||
/* netcmp.c */
|
||||
extern struct nlist *LookupClassEquivalent(char *model, int file1, int file2);
|
||||
extern void AssignCircuits(char *name1, int file1, char *name2, int file2);
|
||||
|
|
|
|||
|
|
@ -44,6 +44,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
// Global storage for parameters from .PARAM
|
||||
struct hashdict spiceparams;
|
||||
|
||||
// Global setting for auto-detect of empty subcircuits as
|
||||
// black-box subcells.
|
||||
int auto_blackbox = FALSE;
|
||||
|
||||
// Check if a token represents a numerical value (with
|
||||
// units) or an expression. This is basically a hack
|
||||
// to see if it either passes StringIsValue() or is
|
||||
|
|
@ -400,6 +404,7 @@ int renamepins(struct hashlist *p, int file)
|
|||
|
||||
void CleanupSubcell() {
|
||||
int maxnode = 0;
|
||||
int has_devices = FALSE;
|
||||
struct objlist *sobj, *nobj, *lobj, *pobj;
|
||||
|
||||
if (CurrentCell == NULL) return;
|
||||
|
|
@ -411,6 +416,8 @@ void CleanupSubcell() {
|
|||
lobj = NULL;
|
||||
for (sobj = CurrentCell->cell; sobj != NULL;) {
|
||||
nobj = sobj->next;
|
||||
if (sobj->type == FIRSTPIN)
|
||||
has_devices = TRUE;
|
||||
if (sobj->node < 0) {
|
||||
if (IsGlobal(sobj)) {
|
||||
if (lobj != NULL)
|
||||
|
|
@ -439,6 +446,8 @@ void CleanupSubcell() {
|
|||
lobj = sobj;
|
||||
sobj = nobj;
|
||||
}
|
||||
if ((has_devices == FALSE) && (auto_blackbox == TRUE))
|
||||
SetClass(CLASS_MODULE);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -381,6 +381,9 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
|||
set dolist 1
|
||||
set dojson 1
|
||||
set lvs_final {}
|
||||
} elseif {$arg == "-blackbox"} {
|
||||
puts stdout "Treating empty subcircuits as black-box cells"
|
||||
netgen::model blackbox on
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1528,8 +1528,27 @@ _netgen_model(ClientData clientData,
|
|||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/* Check for "model blackbox on|off" */
|
||||
/* Behavior is to treat empty subcircuits as blackbox cells */
|
||||
|
||||
if ((objc > 1) && !strcmp(Tcl_GetString(objv[1]), "blackbox")) {
|
||||
if ((objc > 2) && !strcmp(Tcl_GetString(objv[2]), "on")) {
|
||||
auto_blackbox = TRUE;
|
||||
return TCL_OK;
|
||||
}
|
||||
else if ((objc > 2) && !strcmp(Tcl_GetString(objv[2]), "off")) {
|
||||
auto_blackbox = FALSE;
|
||||
return TCL_OK;
|
||||
}
|
||||
else if (objc == 2) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(auto_blackbox));
|
||||
return TCL_OK;
|
||||
}
|
||||
}
|
||||
|
||||
result = CommonParseCell(interp, objv[1], &tp, &fnum);
|
||||
if (result != TCL_OK) return result;
|
||||
if (result != TCL_OK)
|
||||
return result;
|
||||
|
||||
if (objc == 3) {
|
||||
model = Tcl_GetString(objv[2]);
|
||||
|
|
|
|||
Loading…
Reference in New Issue