226 lines
5.1 KiB
C
226 lines
5.1 KiB
C
|
|
/*
|
|
*-------------------------------------------------------------------------
|
|
*
|
|
* 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 <stdio.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
|
|
#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);
|
|
}
|