17 #define umalloc(u) (union u*)tmalloc(sizeof(union u)) 37 for (PDesc = Pointer->oPrptyList; PDesc; PDesc = PDesc->
prpty_Succ) {
79 for (pdesc = odesc->oPrptyList; pdesc; pdesc = pdesc->
prpty_Succ) {
109 Pointer->oPrptyList = PDesc;
122 static int lcomp(
char**,
char**);
153 for (d = d0; d; d = d->
li_next)
167 struct line *d0,*
d,*d1;
170 for (d = d0; d; d = d->
li_next) {
173 fprintf(fp,
"%s\n",d1->
li_line);
198 for (d = line; d; d = d->
li_next)
214 struct s *Desc, *TmpD;
223 char *value,*
model, *extra;
239 CDGen(CellDesc,GenDesc,&Pointer);
240 if (Pointer ==
NULL)
break;
243 name = ((
struct c *)Pointer->
oRep)->cMaster->mName;
244 if (
cieq(name,
"gnd"))
continue;
248 for (i = 0; i < 20; i++)
262 if (maxn < p_data->p_node.inode)
267 sprintf(device,
"%s%d",
295 for (s =
TypeOut,i = 0; i <= maxn; i++) {
296 sprintf(s,
" %d",nodes[i]);
299 i = strlen(device) + strlen(
TypeOut) + 1;
301 i += strlen(subname) + 1;
303 i += strlen(model) + 1;
305 i += strlen(value) + 1;
307 i += strlen(extra) + 1;
361 MDesc = CellDesc->sMasterList;
362 for (; MDesc; MDesc = MDesc->
mSucc) {
366 for (i = 0; i < 20; i++)
378 if (maxn < p_data->p_node.inode)
398 sprintf(
TypeOut,
".subckt %s",subname);
401 for (i = 0; i <= maxn; i++) {
402 sprintf(s,
" %d",nodes[i]);
412 sprintf(
TypeOut,
".ends %s",subname);
442 for (i = 0,l = line; l; i++,l = l->
li_next) ;
444 stuff = (
char **)
malloc(i*
sizeof(
char *));
446 for (i = 0, l = line; l; i++,l = l->li_next)
447 stuff[i] = l->li_line;
448 qsort((
char *) stuff, i,
sizeof (
char *),
450 (
int(*)(
const void*,
const void*))
lcomp);
454 for (i = 0, l = line; l; i++,l = l->li_next)
455 l->li_line = stuff[i];
466 return (strcmp(*s,*t));
516 struct s *Desc, *TmpD;
527 MDesc = CellDesc->sMasterList;
528 for (; MDesc; MDesc = MDesc->
mSucc) {
561 CDGen(CellDesc,GenDesc,&Pointer);
562 if (Pointer ==
NULL)
break;
587 for (i = 0; i < 128; i++)
598 CDGen(CellDesc,GenDesc,&Pointer);
599 if (Pointer ==
NULL)
break;
602 name = ((
struct c *)Pointer->
oRep)->cMaster->mName;
603 if (
cieq(name,
"gnd")) {
640 for (count = 0,w = w0; w; w = w->
ww_next)
646 for (w = w0; w; w = w->
ww_next)
652 for (w = w0; w; w = w->
ww_next)
653 for (wx = d0; wx; wx = wx->
ww_next)
656 for (w = d0; w; w = w->
ww_next)
659 for (w = d0; w; w = w->
ww_next)
663 for (w = d0; w; w = w->
ww_next)
667 PDesc = CellDesc->sPrptyList;
691 Wpath = ((
struct w *)Pointer->oRep)->wPath;
693 for (; Wpath; Wpath = Wpath->
pSucc)
694 for (w = Path; w; w = w->
pSucc)
695 if (w->
pX == Wpath->
pX && w->
pY == Wpath->
pY)
711 PDesc = Pointer->oPrptyList;
714 if (PDesc ==
NULL)
return;
727 struct
o *Pointer1,*Pointer2;
729 struct p *p1,*p2,*
pp;
730 struct prpty *PDesc1,*PDesc2;
733 p1 = ((
struct w *)Pointer1->
oRep)->wPath;
734 p2 = ((
struct w *)Pointer2->
oRep)->wPath;
736 for (; p1; p1 = p1->
pSucc) {
737 for (pp = p2; pp; pp = pp->
pSucc) {
739 if (p1->
pX == pp->
pX && p1->
pY == pp->
pY) {
756 if (node1 < 0 || node2 < 0)
760 if (node1 == node2)
return;
782 for (; WList; WList = WList->ww_next) {
783 PDesc = WList->ww_ptr->oPrptyList;
805 itmp = (
int *)
malloc((*count+1)*
sizeof(int));
808 for (i = 0; i <= *
count; i++)
811 for (w = Wlist; w; w = w->
ww_next) {
820 for (sum = 0,i = 1; i <= *
count; i++) {
826 for (w = Wlist; w; w = w->
ww_next) {
845 struct
o *Pointer1,*Pointer2;
848 struct prpty *PDesc1,*PDesc2;
851 p1 = ((
struct w *)Pointer1->oRep)->wPath;
852 PDesc1 = Pointer1->oPrptyList;
863 PDesc2 = Pointer2->oPrptyList;
866 for (pp = p1; pp; pp = pp->
pSucc) {
888 for (PDesc = Pointer->oPrptyList; PDesc; PDesc = PDesc->
prpty_Succ) {
890 for (pp = Path; pp; pp = pp->
pSucc) {
907 struct
o *Pointer1,*Pointer2;
911 struct prpty *PDesc1,*PDesc2,*pd;
915 PDesc1 = Pointer1->oPrptyList;
916 PDesc2 = Pointer2->oPrptyList;
933 if (int11 < 0 && int21 >= 0) {
937 else if (int21 < 0 && int11 >= 0) {
940 else if (int11 < 0 && int21 < 0) {
946 else if (int11 != int21) {
965 PDesc = Pointer->oPrptyList;
981 struct
ww *Wlist,*Dlist;
989 for (w = Dlist; w; w = w->
ww_next) {
1000 for (w = Wlist; w; w = w->
ww_next) {
1002 for (; Path; Path = Path->
pSucc) {
1003 if (X == Path->
pX && Y == Path->
pY) {
1056 static int pType(
int);
1069 struct prpty *PDesc;
1071 char Types[4], *TypeIn;
1088 "Select object, at \">\" hit ENTER or a (add/repl), d (delete), n (break).");
1102 "Hit * for global, at \">\" hit a (add/repl), d (delete), n (next), ENTER.");
1124 if (PDesc ==
NULL) {
1132 sprintf(
TypeOut,
"Wire Node Number (internal): %d > ",
1138 if (Pret == -1)
goto next;
1144 sprintf(
TypeOut,
"Model: %s > ",
1150 if (Pret == -1)
goto next;
1153 sprintf(
TypeOut,
"Value: %s > ",
1159 if (Pret == -1)
goto next;
1162 sprintf(
TypeOut,
"Initial Conditions: %s > ",
1168 if (Pret == -1)
goto next;
1171 sprintf(
TypeOut,
"External Property: %s > ",
1177 if (Pret == -1)
goto next;
1180 sprintf(
TypeOut,
"Device Name (internal): %s%d > ",
1186 if (Pret == -1)
goto next;
1189 sprintf(
TypeOut,
"Node Number (internal): %d > ",
1194 if (Pret == -1)
goto next;
1197 sprintf(
TypeOut,
"Branch (internal) > ");
1201 if (Pret == -1)
goto next;
1239 struct
prpty *PDesc;
1249 if (InChar ==
'n' || InChar ==
'N')
1252 if (InChar ==
'\0' || InChar ==
'\n' || InChar ==
'\r')
1255 if (Pointer->oType ==
CDWIRE) {
1260 if (InChar ==
'a' || InChar ==
'A') {
1264 "Enter property type to add (Model m Value v Init Cnd i Other o): ");
1267 if (InChar ==
'\n' || InChar ==
'\r') {
1274 Value =
pType(InChar);
1289 for (pd = Pointer->oPrptyList; pd; pd = pd->
prpty_Succ)
1295 for (pd = Pointer->oPrptyList; pd; pd = pd->
prpty_Succ)
1302 for (pd = Pointer->oPrptyList; pd; pd = pd->
prpty_Succ)
1330 for (pd = Pointer->oPrptyList; pd; pd = pd->
prpty_Succ)
1341 ShowPrompt(
"Also store in? (Model m Value v Inid Cnd i): ");
1346 for (pd = Pointer->oPrptyList; pd; pd = pd->
prpty_Succ)
1357 Pointer->oPrptyList = pd;
1367 for (pd = Pointer->oPrptyList; pd; pd = pd->
prpty_Succ)
1378 Pointer->oPrptyList = pd;
1383 else if (InChar ==
'd' || InChar ==
'D') {
1384 if (PDesc ==
NULL) {
1392 pd = Pointer->oPrptyList;
1421 "Enter property type to globally add/repl (Model m Value v Init Cnd i): ");
1425 val =
pType(InChar);
1437 ShowPrompt(
"Bad entry, enter m,v,i or Esc to exit: ");
1515 struct prpty *PDesc;
1516 int setone,
count,int1,int2;
1520 ShowPrompt(
"Point to subcircuit connection points (ESC to exit).");
1527 *LookedAhead =
False;
1597 struct prpty *PDesc;
1601 for (; PDesc; PPrev = PDesc,PDesc = PDesc->
prpty_Succ) {
1602 if (PDesc->prpty_Value !=
P_NODE)
continue;
1603 if (X == PDesc->prpty_Data->p_node.x &&
1604 Y == PDesc->prpty_Data->p_node.y) {
1610 free(PDesc->prpty_Data);
1615 sprintf(
TypeOut,
"-1 0 %ld %ld",X,Y);
1635 struct prpty *PDesc;
1645 AOI.
kaLeft = *Xo - Delta;
1648 AOI.
kaTop = *Yo + Delta;
1657 if (
InBox(X,Y,&AOI)) {
1669 if (Pointer ==
NULL)
break;
1678 if (
InBox(X,Y,&AOI)) {
1692 if (Pointer ==
NULL)
break;
1695 CDWire(Pointer,&Layer,&Width,&Path);
1697 for (; Path; Path = Path->
pSucc)
1733 struct prpty *PDesc;
1769 struct prpty *PDesc;
1772 long X,
Y,Width,X1,Y1,X2,Y2;
1784 if (!
InBox(X,Y,&BB))
continue;
1785 switch (Pointer->oType) {
1787 CDWire(Pointer,&Layer,&Width,&Path);
1822 if (X1 > X2) X1 = X2;
1823 if (Y1 > Y2) Y1 = Y2;
1850 struct prpty *PDesc;
1853 if (Pointer->oType !=
CDWIRE)
return;
1860 if (RefX == X && RefY == Y) {
1879 struct prpty *PDesc;
1896 struct prpty *PDesc;
1915 struct prpty *PDesc;
1925 if (Pointer ==
NULL)
break;
struct prpty * sPrptyList
static void insert_terminal()
void AssignWireProperties(struct o *Pointer)
struct line * PrintMutual()
static void spice_deck_sort()
void Subcircuit(int *LookedAhead)
static void set_device_node()
void ConnectRecursive(struct s *CellDesc)
struct line * AllocateLine()
void DisplayTerminals(int DisplayOrErase)
static void change_wire_node()
static void renumber_wires()
static int is_wire_grounded()
static void global_modify()
void ShowProperties(int *LookedAhead)
static void connect_wire_to_device()
void UpdateProperties(struct o *Pointer)
union prp_data * prpty_Data
void DumpSpiceFile(FILE *fp)
struct hprlist * FBHyEdit()
static void set_wire_node()
void TransformReferences(struct o *Pointer)
int SelectNode(long *Xo, long *Yo)
void ClearReferenceUndoFlags()
static void connect_ground_to_device()
static void update_device(struct o *odesc, refcnts)
struct prp_branch p_branch
struct line * MakeSpiceDeck()
int kpEnableSelectQRedisplay
void Connect(struct s *CellDesc)
struct line * SpiceList(struct s *CellDesc)
struct prpty * prpty_Succ
void UndoReferenceTransform()
struct line * PrintModels()
static void connect_wires()
void TransformReferencePoint(struct o *Pointer, long RefX, long RefY)
void ShowPrompt(char *str)
static void connect_devices()
struct prpty * oPrptyList
#define HighlightingColor
struct hprlist * HYcopy()