/* *------------------------------------------------------------------------- * * Write.c -- Dumps network * * *------------------------------------------------------------------------- */ #define MILLITOKILO 1e-6 #ifndef lint static char sccsid[] = "@(#)Write.c 4.10 MAGIC (Stanford Addition) 07/86"; #endif /* not lint */ #include #include #include #include #include "utils/magic.h" #include "utils/geometry.h" #include "utils/geofast.h" #include "tiles/tile.h" #include "utils/hash.h" #include "database/database.h" #include "utils/malloc.h" #include "textio/textio.h" #include "extract/extract.h" #include "extract/extractInt.h" #include "windows/windows.h" #include "dbwind/dbwind.h" #include "utils/stack.h" #include "utils/tech.h" #include "textio/txcommands.h" #include "resis/resis.h" #define RT_SIZE 0xf #define MAXTOKEN 256 #define DEVFLATSIZE 1024 #define RESGROUPSIZE 256 void ResPrintNetwork(filename, reslist) char *filename; resResistor *reslist; { char bigname[255], name1[255], name2[255]; FILE *fp; int i = 1; sprintf(bigname, "%s.%s", filename, "res"); fp = fopen(bigname, "w"); if (fp != NULL) { for (; reslist; reslist = reslist->rr_nextResistor) { if (reslist->rr_connection1->rn_id == 0) { reslist->rr_connection1->rn_id = i++; } if (reslist->rr_connection2->rn_id == 0) { reslist->rr_connection2->rn_id = i++; } if (reslist->rr_connection1->rn_why == RES_NODE_ORIGIN) { sprintf(name1, "gnd"); } else { sprintf(name1, "n%d_%d_%d", reslist->rr_connection1->rn_id, reslist->rr_connection1->rn_loc.p_x, reslist->rr_connection1->rn_loc.p_y); } if (reslist->rr_connection2->rn_why == RES_NODE_ORIGIN) { sprintf(name2,"gnd"); } else { sprintf(name2, "n%d_%d_%d", reslist->rr_connection2->rn_id, reslist->rr_connection2->rn_loc.p_x, reslist->rr_connection2->rn_loc.p_y); } fprintf(fp, "r %s %s %f\n", name1, name2, (float)(reslist->rr_value) * MILLITOKILO); } } fclose(fp); } void ResPrintCurrents(filename, extension, node) char *filename; float extension; resNode *node; { char bigname[255]; FILE *fp; int resCurrentPrintFunc(); sprintf(bigname, "%s.%d", filename, abs((int)(extension))); fp = fopen(bigname, "w"); if (fp != NULL) { (void) ResTreeWalk(node, NULL, resCurrentPrintFunc, RES_DO_FIRST, RES_NO_LOOP, RES_NO_FLAGS, fp); } fclose(fp); } /* *------------------------------------------------------------------------- * * resCurrentPrintFunc -- prints out a node of network in form compatible with * the linear network solver. Designed for use with ResTreeWalk. * * *------------------------------------------------------------------------- */ void resCurrentPrintFunc(node, resistor, filename) resNode *node; resResistor *resistor; FILE *filename; { tElement *workingDev; float i_sum = 0.0; for (workingDev = node->rn_te; workingDev != NULL; workingDev = workingDev->te_nextt) { if ((workingDev->te_thist->rd_status & RES_DEV_PLUG) || workingDev->te_thist->rd_gate != node) i_sum += workingDev->te_thist->rd_i; } if (i_sum != 0.0) { if (node->rn_why == RES_NODE_ORIGIN) { fprintf(filename, "i gnd %f\n", i_sum); } else { fprintf(filename, "i n%d_%d %f\n", node->rn_loc.p_x, node->rn_loc.p_y, i_sum); } } } void ResDeviceCounts() { int i,j,k; resNode *n; resDevice *t; resResistor *r; for (n = ResNodeList, i = 0; n != NULL; n = n->rn_more, i++); for (t = ResDevList, j = 0; t != NULL; t = t->rd_nextDev, j++); for (r = ResResList, k = 0; r != NULL; r = r->rr_nextResistor, k++); TxError("n=%d t=%d r=%d\n", i, j, k); TxFlushErr(); } void ResWriteECLFile(filename, reslist, nodelist) char *filename; resResistor *reslist; resNode *nodelist; { char newname[100], *tmpname, *per; FILE *fp; int nodenum = 0; strcpy(newname, filename); if (per = strrchr(newname,'.')) *per = '\0'; strcat(newname, ".res"); if ((fp = fopen(newname, "w")) == NULL) { TxError("Can't open %s\n", newname); return; } for (; nodelist; nodelist = nodelist->rn_more) { if (nodelist->rn_name == NULL) { if (nodelist->rn_noderes == 0) { strcpy(newname, "gnd"); } else { (void)sprintf(newname, "n%d_%d_%d", nodelist->rn_loc.p_x, nodelist->rn_loc.p_y, nodenum++); } tmpname = (char *)mallocMagic((unsigned) (strlen(newname) + 1)); strcpy(tmpname, newname); nodelist->rn_name = tmpname; } } for (; reslist; reslist = reslist->rr_nextResistor) { fprintf(fp, "r %s %s %f %s %d\n", reslist->rr_node[0]->rn_name, reslist->rr_node[1]->rn_name, /* /1000.0 gets ohms from milliohms */ (float)(reslist->rr_value) / 1000.0, DBTypeShortName(reslist->rr_tt), reslist->rr_csArea); } fclose(fp); }