Corrected an error in extresist that caused it to lose track of any

port that has zero area for the label rectangle.
This commit is contained in:
Tim Edwards 2021-05-09 16:58:49 -04:00
parent 94a6daa9b0
commit 693256c373
3 changed files with 118 additions and 107 deletions

View File

@ -1 +1 @@
8.3.161 8.3.162

View File

@ -217,6 +217,18 @@ ResMakePortBreakpoints(def)
plane = def->cd_planes[DBPlane(node->rs_ttype)]; plane = def->cd_planes[DBPlane(node->rs_ttype)];
rect = &(node->rs_bbox); rect = &(node->rs_bbox);
/* Beware of zero-area ports */
if (rect->r_xbot == rect->r_xtop)
{
rect->r_xbot--;
rect->r_xtop++;
}
if (rect->r_ybot == rect->r_ytop)
{
rect->r_ybot--;
rect->r_ytop++;
}
TTMaskSetOnlyType(&mask, node->rs_ttype); TTMaskSetOnlyType(&mask, node->rs_ttype);
(void) DBSrPaintArea((Tile *) NULL, plane, rect, &mask, (void) DBSrPaintArea((Tile *) NULL, plane, rect, &mask,
ResAddBreakpointFunc, (ClientData)node); ResAddBreakpointFunc, (ClientData)node);

View File

@ -48,52 +48,52 @@ extern ResSimNode *ResInitializeNode();
*/ */
void void
ResPrintExtRes(outextfile,resistors,nodename) ResPrintExtRes(outextfile, resistors, nodename)
FILE *outextfile; FILE *outextfile;
resResistor *resistors; resResistor *resistors;
char *nodename; char *nodename;
{ {
int nodenum=0; int nodenum=0;
char newname[MAXNAME]; char newname[MAXNAME];
HashEntry *entry; HashEntry *entry;
ResSimNode *node,*ResInitializeNode(); ResSimNode *node, *ResInitializeNode();
for (; resistors != NULL; resistors=resistors->rr_nextResistor) for (; resistors != NULL; resistors = resistors->rr_nextResistor)
{ {
/* /*
These names shouldn't be null; they should either be set by * These names shouldn't be null; they should either be set by
the device name or by the node printing routine. This * the device name or by the node printing routine. This
code is included in case the resistor network is printed * code is included in case the resistor network is printed
before the nodes. * before the nodes.
*/ */
if (resistors->rr_connection1->rn_name == NULL)
{ if (resistors->rr_connection1->rn_name == NULL)
(void)sprintf(newname,"%s%s%d",nodename,".r",nodenum++); {
entry = HashFind(&ResNodeTable,newname); (void)sprintf(newname, "%s%s%d", nodename, ".r", nodenum++);
node = ResInitializeNode(entry); entry = HashFind(&ResNodeTable, newname);
resistors->rr_connection1->rn_name = node->name; node = ResInitializeNode(entry);
node->oldname = nodename; resistors->rr_connection1->rn_name = node->name;
} node->oldname = nodename;
if (resistors->rr_connection2->rn_name == NULL) }
{ if (resistors->rr_connection2->rn_name == NULL)
(void)sprintf(newname,"%s%s%d",nodename,".r",nodenum++); {
entry = HashFind(&ResNodeTable,newname); (void)sprintf(newname, "%s%s%d", nodename, ".r", nodenum++);
node = ResInitializeNode(entry); entry = HashFind(&ResNodeTable, newname);
resistors->rr_connection2->rn_name = node->name; node = ResInitializeNode(entry);
node->oldname = nodename; resistors->rr_connection2->rn_name = node->name;
} node->oldname = nodename;
if (ResOptionsFlags & ResOpt_DoExtFile) }
{ if (ResOptionsFlags & ResOpt_DoExtFile)
fprintf(outextfile, "resist \"%s\" \"%s\" %g\n", {
fprintf(outextfile, "resist \"%s\" \"%s\" %g\n",
resistors->rr_connection1->rn_name, resistors->rr_connection1->rn_name,
resistors->rr_connection2->rn_name, resistors->rr_connection2->rn_name,
resistors->rr_value / (float)ExtCurStyle->exts_resistScale); resistors->rr_value / (float)ExtCurStyle->exts_resistScale);
} }
} }
} }
/* /*
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
* *
@ -205,65 +205,64 @@ ResPrintExtNode(outextfile, nodelist, nodename)
FILE *outextfile; FILE *outextfile;
resNode *nodelist; resNode *nodelist;
char *nodename; char *nodename;
{ {
int nodenum=0; int nodenum = 0;
char newname[MAXNAME],tmpname[MAXNAME],*cp; char newname[MAXNAME], tmpname[MAXNAME], *cp;
HashEntry *entry; HashEntry *entry;
ResSimNode *node,*ResInitializeNode(); ResSimNode *node, *ResInitializeNode();
bool DoKillNode = TRUE; bool DoKillNode = TRUE;
resNode *snode = nodelist; resNode *snode = nodelist;
/* If any of the subnode names match the original node name, then */ /* If any of the subnode names match the original node name, then */
/* we don't want to rip out that node with a "killnode" statement. */ /* we don't want to rip out that node with a "killnode" statement. */
for (; nodelist != NULL; nodelist = nodelist->rn_more) for (; nodelist != NULL; nodelist = nodelist->rn_more)
{
if (nodelist->rn_name != NULL) if (nodelist->rn_name != NULL)
if (!strcmp(nodelist->rn_name, nodename)) if (!strcmp(nodelist->rn_name, nodename))
{ {
DoKillNode = FALSE; DoKillNode = FALSE;
break; break;
} }
}
if ((ResOptionsFlags & ResOpt_DoExtFile) && DoKillNode) if ((ResOptionsFlags & ResOpt_DoExtFile) && DoKillNode)
{ {
fprintf(outextfile,"killnode \"%s\"\n",nodename); fprintf(outextfile, "killnode \"%s\"\n", nodename);
} }
/* Create "rnode" entries for each subnode */ /* Create "rnode" entries for each subnode */
for (; snode != NULL; snode = snode->rn_more) for (; snode != NULL; snode = snode->rn_more)
{ {
if (snode->rn_name == NULL) if (snode->rn_name == NULL)
{ {
(void)sprintf(tmpname,"%s",nodename); (void)sprintf(tmpname,"%s",nodename);
cp = tmpname + strlen(tmpname) - 1; cp = tmpname + strlen(tmpname) - 1;
if (*cp == '!' || *cp == '#') *cp = '\0'; if (*cp == '!' || *cp == '#') *cp = '\0';
(void)sprintf(newname,"%s%s%d",tmpname,".n",nodenum++); (void)sprintf(newname, "%s%s%d", tmpname, ".n", nodenum++);
entry = HashFind(&ResNodeTable,newname); entry = HashFind(&ResNodeTable, newname);
node = ResInitializeNode(entry); node = ResInitializeNode(entry);
snode->rn_name = node->name; snode->rn_name = node->name;
node->oldname = nodename; node->oldname = nodename;
} }
if (ResOptionsFlags & ResOpt_DoExtFile) if (ResOptionsFlags & ResOpt_DoExtFile)
{ {
/* rnode name R C x y type (R is always 0) */ /* rnode name R C x y type (R is always 0) */
fprintf(outextfile, "rnode \"%s\" 0 %g %d %d %d\n", fprintf(outextfile, "rnode \"%s\" 0 %g %d %d %d\n",
snode->rn_name, snode->rn_name,
(snode->rn_float.rn_area/ (snode->rn_float.rn_area / ExtCurStyle->exts_capScale),
ExtCurStyle->exts_capScale),
snode->rn_loc.p_x, snode->rn_loc.p_x,
snode->rn_loc.p_y, snode->rn_loc.p_y,
/* the following is TEMPORARILY set to 0 */ /* the following is TEMPORARILY set to 0 */
0); 0);
} }
} }
} }
/* /*
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
* *
@ -279,39 +278,39 @@ ResPrintExtNode(outextfile, nodelist, nodename)
*/ */
void void
ResPrintStats(goodies,name) ResPrintStats(goodies, name)
ResGlobalParams *goodies; ResGlobalParams *goodies;
char *name; char *name;
{ {
static int totalnets=0,totalnodes=0,totalresistors=0; static int totalnets = 0, totalnodes = 0, totalresistors = 0;
int nodes,resistors; int nodes, resistors;
resNode *node; resNode *node;
resResistor *res; resResistor *res;
if (goodies == NULL) if (goodies == NULL)
{ {
TxError("nets:%d nodes:%d resistors:%d\n", TxError("nets:%d nodes:%d resistors:%d\n",
totalnets,totalnodes,totalresistors); totalnets, totalnodes, totalresistors);
totalnets=0; totalnets = 0;
totalnodes=0; totalnodes = 0;
totalresistors=0; totalresistors = 0;
return; return;
} }
nodes=0; nodes = 0;
resistors=0; resistors = 0;
totalnets++; totalnets++;
for (node = ResNodeList; node != NULL; node=node->rn_more) for (node = ResNodeList; node != NULL; node=node->rn_more)
{ {
nodes++; nodes++;
totalnodes++; totalnodes++;
} }
for (res = ResResList; res != NULL; res=res->rr_nextResistor) for (res = ResResList; res != NULL; res=res->rr_nextResistor)
{ {
resistors++; resistors++;
totalresistors++; totalresistors++;
} }
TxError("%s %d %d\n",name,nodes,resistors); TxError("%s %d %d\n", name, nodes, resistors);
} }
/* /*
@ -326,8 +325,8 @@ ResPrintStats(goodies,name)
void void
resWriteNodeName(fp, nodeptr) resWriteNodeName(fp, nodeptr)
FILE *fp; FILE *fp;
resNode *nodeptr; resNode *nodeptr;
{ {
if (nodeptr->rn_name == NULL) if (nodeptr->rn_name == NULL)
fprintf(fp, "N%d", nodeptr->rn_id); fprintf(fp, "N%d", nodeptr->rn_id);