magic/resis/ResWrite.c

230 lines
5.2 KiB
C
Raw Permalink Normal View History

/*
*-------------------------------------------------------------------------
*
* 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);
}