Merge branch 'master' into netgen-1.5
This commit is contained in:
commit
7870538ec9
|
|
@ -7068,12 +7068,15 @@ int IgnoreClass(char *name, int file, unsigned char type)
|
||||||
/* If file1 and file2 are -1, then these are names to */
|
/* If file1 and file2 are -1, then these are names to */
|
||||||
/* be checked as netcmp works through the hierarchy. */
|
/* be checked as netcmp works through the hierarchy. */
|
||||||
/* Otherwise, look up the structure for each file and */
|
/* Otherwise, look up the structure for each file and */
|
||||||
/* set the classhash of the second to that of the first */
|
/* set the classhash of the second to that of the */
|
||||||
|
/* first. If "dounique" is 1, then give the two cells */
|
||||||
|
/* their own class hash; they will not be compared */
|
||||||
|
/* any other cells in either netlist. */
|
||||||
/* */
|
/* */
|
||||||
/* Return 1 on success, 0 on failure */
|
/* Return 1 on success, 0 on failure */
|
||||||
/*------------------------------------------------------*/
|
/*------------------------------------------------------*/
|
||||||
|
|
||||||
int EquivalenceClasses(char *name1, int file1, char *name2, int file2)
|
int EquivalenceClasses(char *name1, int file1, char *name2, int file2, int dounique)
|
||||||
{
|
{
|
||||||
char *class1, *class2;
|
char *class1, *class2;
|
||||||
struct Correspond *newc;
|
struct Correspond *newc;
|
||||||
|
|
@ -7098,16 +7101,19 @@ int EquivalenceClasses(char *name1, int file1, char *name2, int file2)
|
||||||
if (tp->flags & CELL_DUPLICATE)
|
if (tp->flags & CELL_DUPLICATE)
|
||||||
reverse = 1;
|
reverse = 1;
|
||||||
|
|
||||||
/* Do a cross-check for each name in the other netlist. If */
|
if (dounique) {
|
||||||
/* conflicting names exist, then alter the classhash to make it */
|
|
||||||
/* unique. In the case of duplicate cells, don't do this. */
|
|
||||||
|
|
||||||
if (!(tp->flags & CELL_DUPLICATE) && !(tp2->flags & CELL_DUPLICATE) &&
|
/* Do a cross-check for each name in the other netlist. If */
|
||||||
|
/* conflicting names exist, then alter the classhash to make */
|
||||||
|
/* it unique. In the case of duplicate cells, don't do this. */
|
||||||
|
|
||||||
|
if (!(tp->flags & CELL_DUPLICATE) && !(tp2->flags & CELL_DUPLICATE) &&
|
||||||
!(*matchfunc)(name1, name2)) {
|
!(*matchfunc)(name1, name2)) {
|
||||||
tpx = LookupCellFile(name1, file2);
|
tpx = LookupCellFile(name1, file2);
|
||||||
if (tpx != NULL) need_new_seed = 1;
|
if (tpx != NULL) need_new_seed = 1;
|
||||||
tpx = LookupCellFile(name2, file1);
|
tpx = LookupCellFile(name2, file1);
|
||||||
if (tpx != NULL) need_new_seed = 1;
|
if (tpx != NULL) need_new_seed = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now make the classhash values the same so that these cells */
|
/* Now make the classhash values the same so that these cells */
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,8 @@ extern int PermuteSetup(char *model, int filenum, char *pin1, char *pin2);
|
||||||
extern int PermuteForget(char *model, int filenum, char *pin1, char *pin2);
|
extern int PermuteForget(char *model, int filenum, char *pin1, char *pin2);
|
||||||
extern int EquivalenceElements(char *name1, int file1, char *name2, int file2);
|
extern int EquivalenceElements(char *name1, int file1, char *name2, int file2);
|
||||||
extern int EquivalenceNodes(char *name1, int file1, char *name2, int file2);
|
extern int EquivalenceNodes(char *name1, int file1, char *name2, int file2);
|
||||||
extern int EquivalenceClasses(char *name1, int file1, char *name2, int file2);
|
extern int EquivalenceClasses(char *name1, int file1, char *name2, int file2,
|
||||||
|
int dounique);
|
||||||
extern int IgnoreClass(char *name, int file, unsigned char type);
|
extern int IgnoreClass(char *name, int file, unsigned char type);
|
||||||
extern int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist);
|
extern int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist);
|
||||||
extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run,
|
extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run,
|
||||||
|
|
|
||||||
|
|
@ -2902,7 +2902,7 @@ _netcmp_equate(ClientData clientData,
|
||||||
struct ElementClass *saveEclass = NULL;
|
struct ElementClass *saveEclass = NULL;
|
||||||
struct NodeClass *saveNclass = NULL;
|
struct NodeClass *saveNclass = NULL;
|
||||||
int file1, file2;
|
int file1, file2;
|
||||||
int i, l1, l2, ltest, lent, dolist = 0, doforce = 0;
|
int i, l1, l2, ltest, lent, dolist = 0, doforce = 0, dounique = 0;
|
||||||
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
Tcl_Obj *tobj1, *tobj2, *tobj3;
|
||||||
|
|
||||||
while (objc > 1) {
|
while (objc > 1) {
|
||||||
|
|
@ -2918,6 +2918,11 @@ _netcmp_equate(ClientData clientData,
|
||||||
objv++;
|
objv++;
|
||||||
objc--;
|
objc--;
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(optstart, "unique")) {
|
||||||
|
dounique = 1;
|
||||||
|
objv++;
|
||||||
|
objc--;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -3342,19 +3347,9 @@ _netcmp_equate(ClientData clientData,
|
||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now that all pins are assigned by name, reorder */
|
|
||||||
/* the pin lists of the 2nd cell to match the */
|
|
||||||
/* order of the 1st. */
|
|
||||||
|
|
||||||
/* Reorder the pin lists of instances of the 2nd */
|
|
||||||
/* cell to match the order of the 1st. */
|
|
||||||
|
|
||||||
// pindata.cell2 = tp2;
|
|
||||||
// RecurseCellHashTable2(pinorder, (void *)(&pindata));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EquivalenceClasses(tp1->name, file1, tp2->name, file2)) {
|
if (EquivalenceClasses(tp1->name, file1, tp2->name, file2, dounique)) {
|
||||||
Fprintf(stdout, "Device classes %s and %s are equivalent.\n",
|
Fprintf(stdout, "Device classes %s and %s are equivalent.\n",
|
||||||
tp1->name, tp2->name);
|
tp1->name, tp2->name);
|
||||||
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
|
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue