diff --git a/VERSION b/VERSION index abe35e8c..e1f1250a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.3.399 +8.3.400 diff --git a/ext2spice/ext2hier.c b/ext2spice/ext2hier.c index 518221d1..fd068e7e 100644 --- a/ext2spice/ext2hier.c +++ b/ext2spice/ext2hier.c @@ -1144,33 +1144,49 @@ spcdevHierMergeVisit(hc, dev, scale) { /* To-do: add back source, drain attribute check */ + /* Default case: Add the counts together */ + m = esFMult[cfp->esFMIndex] + esFMult[fp->esFMIndex]; + switch(dev->dev_class) { case DEV_MOSFET: case DEV_MSUBCKT: case DEV_ASYMMETRIC: case DEV_FET: - m = esFMult[cfp->esFMIndex] + (fp->w / cfp->w); + if (cfp->w > 0) + m = esFMult[cfp->esFMIndex] + (fp->w / cfp->w); break; case DEV_RSUBCKT: case DEV_RES: if ((fp->dev->dev_type == esNoModelType) || !strcmp(EFDevTypes[fp->dev->dev_type], "None")) - m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res - / cfp->dev->dev_res); + { + if (cfp->dev->dev_res > 0) + m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res + / cfp->dev->dev_res); + } else - m = esFMult[cfp->esFMIndex] + (fp->l / cfp->l); + { + if (cfp->l > 0) + m = esFMult[cfp->esFMIndex] + (fp->l / cfp->l); + } break; case DEV_CSUBCKT: case DEV_CAP: case DEV_CAPREV: if ((fp->dev->dev_type == esNoModelType) || !strcmp(EFDevTypes[fp->dev->dev_type], "None")) - m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap - / cfp->dev->dev_cap); + { + if (cfp->dev->dev_cap > 0) + m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap + / cfp->dev->dev_cap); + } else - m = esFMult[cfp->esFMIndex] + - ((fp->l * fp->w) / (cfp->l * cfp->w)); + { + if ((cfp->l > 0) && (cfp->w > 0)) + m = esFMult[cfp->esFMIndex] + + ((fp->l * fp->w) / (cfp->l * cfp->w)); + } break; } setDevMult(fp->esFMIndex, DEV_KILLED); @@ -1584,33 +1600,49 @@ devMergeHierVisit(hc, dev, scale) mergeAttr(&cd->dterm_attrs, &drain->dterm_attrs); } mergeThem: + /* Default case: Add the counts together */ + m = esFMult[cfp->esFMIndex] + esFMult[fp->esFMIndex]; + switch(dev->dev_class) { case DEV_MOSFET: case DEV_ASYMMETRIC: case DEV_MSUBCKT: case DEV_FET: - m = esFMult[cfp->esFMIndex] + ((float)fp->w / (float)cfp->w); + if (cfp->w > 0) + m = esFMult[cfp->esFMIndex] + ((float)fp->w / (float)cfp->w); break; case DEV_RSUBCKT: case DEV_RES: if ((fp->dev->dev_type == esNoModelType) || !strcmp(EFDevTypes[fp->dev->dev_type], "None")) - m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res - / cfp->dev->dev_res); + { + if (cfp->dev->dev_res > 0) + m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res + / cfp->dev->dev_res); + } else - m = esFMult[cfp->esFMIndex] + (fp->l / cfp->l); + { + if (cfp->l > 0) + m = esFMult[cfp->esFMIndex] + (fp->l / cfp->l); + } break; case DEV_CSUBCKT: case DEV_CAP: case DEV_CAPREV: if ((fp->dev->dev_type == esNoModelType) || !strcmp(EFDevTypes[fp->dev->dev_type], "None")) - m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap - / cfp->dev->dev_cap); + { + if (cfp->dev->dev_cap > 0) + m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap + / cfp->dev->dev_cap); + } else - m = esFMult[cfp->esFMIndex] + - ((fp->l * fp->w) / (cfp->l * cfp->w)); + { + if ((cfp->l > 0) && (cfp->w > 0)) + m = esFMult[cfp->esFMIndex] + + ((fp->l * fp->w) / (cfp->l * cfp->w)); + } break; } setDevMult(fp->esFMIndex, DEV_KILLED); diff --git a/ext2spice/ext2spice.c b/ext2spice/ext2spice.c index f3920961..3c4dfad6 100644 --- a/ext2spice/ext2spice.c +++ b/ext2spice/ext2spice.c @@ -4246,31 +4246,47 @@ devMergeVisit(dev, hc, scale, trans) else /* cfp->hierName != hierName */ break; mergeThem: + /* Default case is to add counts */ + m = esFMult[cfp->esFMIndex] + esFMult[fp->esFMIndex]; + switch(dev->dev_class) { case DEV_MSUBCKT: case DEV_MOSFET: case DEV_ASYMMETRIC: case DEV_FET: - m = esFMult[cfp->esFMIndex] + (fp->w / cfp->w); + if (cfp->w > 0) + m = esFMult[cfp->esFMIndex] + (fp->w / cfp->w); break; case DEV_RSUBCKT: case DEV_RES: if (fp->dev->dev_type == esNoModelType) - m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res - / cfp->dev->dev_res); + { + if (cfp->dev->dev_res > 0) + m = esFMult[cfp->esFMIndex] + (fp->dev->dev_res + / cfp->dev->dev_res); + } else - m = esFMult[cfp->esFMIndex] + (fp->l / cfp->l); + { + if (cfp->l > 0) + m = esFMult[cfp->esFMIndex] + (fp->l / cfp->l); + } break; case DEV_CSUBCKT: case DEV_CAP: case DEV_CAPREV: if (fp->dev->dev_type == esNoModelType) - m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap - / cfp->dev->dev_cap); + { + if (cfp->dev->dev_cap > 0) + m = esFMult[cfp->esFMIndex] + (fp->dev->dev_cap + / cfp->dev->dev_cap); + } else - m = esFMult[cfp->esFMIndex] + - ((fp->l * fp->w) / (cfp->l * cfp->w)); + { + if ((cfp->l > 0) && (cfp->w > 0)) + m = esFMult[cfp->esFMIndex] + + ((fp->l * fp->w) / (cfp->l * cfp->w)); + } break; } setDevMult(fp->esFMIndex, DEV_KILLED);