Jspice3
subckt.c File Reference
#include "spice.h"
#include "sced.h"
#include "scedmacs.h"
Include dependency graph for subckt.c:

Go to the source code of this file.

Data Structures

struct  cc
 
struct  rd
 

Macros

#define Mtest(zap)   if((zap) == 0) MallocFailed()
 

Functions

static void set_subckt_list ()
 
static void set_subckt_choices ()
 
static struct omake_array ()
 
static int get_reference_terminal ()
 
static void edit_cell ()
 
static int pop_context ()
 
static struct oselect_first_call ()
 
static struct oselect_call ()
 
static void flatten_cell ()
 
void InitDeviceMenu ()
 
void NewSubckt ()
 
void Place (int *LookedAhead)
 
void ShowNewInstance (long X, long Y, long RefX, long RefY)
 
static struct omake_array (long X, long Y)
 
static int get_reference_terminal (struct s *CellDesc, long *X, long *Y)
 
void NewSymbol ()
 
int MutSelected (struct prpty *PDesc)
 
void Push (int *LookedAhead)
 
static void edit_cell (int Modified)
 
void UpdateParent (char *NewName)
 
void Pop ()
 
int CheckModified ()
 
void ClearContext ()
 
static struct oselect_call (long X, long Y)
 
void Flatten (int *LookedAhead)
 
static void flatten_cell (struct s *CellDesc)
 
int OpenCell (char *Master, struct s **MasterDesc)
 

Variables

static struct ccContext
 
static int WroteCell
 
static char * SubCktList [80]
 
static struct rd CurInstance
 
char * MenuUNDO
 
char * MenuNEWSC
 
char * MenuPLACE
 

Macro Definition Documentation

#define Mtest (   zap)    if((zap) == 0) MallocFailed()

Definition at line 30 of file subckt.c.

Function Documentation

int CheckModified ( )

Definition at line 906 of file subckt.c.

909 {
910  struct s *SDesc;
911  struct cc *Cx = Context;
912  char *TypeIn;
913 
914  while (Cx) {
915  if (Cx->ccModified) {
916  sprintf(TypeOut,"Circuit %s has been modified. Save it? (y) ",
917  Cx->ccMaster);
919  TypeIn = FBEdit(NULL);
920  if (TypeIn == NULL) return (True);
921  if (*TypeIn != 'n' && *TypeIn != 'N') {
922  CDSymbol(Cx->ccMaster,&SDesc);
923  if (SDesc && CDUpdate(SDesc,(char *)NULL)) {
924  Cx->ccModified = False;
925  if (Not CDReflect(SDesc))
926  MallocFailed();
927  }
928  else {
929  /* shouldn't happen */
930  sprintf(TypeOut,"Can't save %s.",Cx->ccMaster);
932  return (True);
933  }
934  }
935  }
936  Cx = Cx->ccNext;
937  }
938  ClearContext();
939  return (False);
940 }
Definition: subckt.c:18
Definition: cddefs.h:119
int CDUpdate()
#define Not
Definition: cdmacs.h:16
char * ccMaster
Definition: subckt.c:23
static struct cc * Context
Definition: subckt.c:28
void ShowPromptAndWait()
void MallocFailed()
Definition: scedintr.c:857
int ccModified
Definition: subckt.c:20
#define NULL
Definition: spdefs.h:121
char TypeOut[200]
Definition: init.c:23
#define True
Definition: scedstub.c:16
struct cc * ccNext
Definition: subckt.c:25
int CDReflect()
void ClearContext()
Definition: subckt.c:944
void CDSymbol()
char * FBEdit()
#define False
Definition: scedstub.c:15
void ShowPrompt(char *str)
Definition: scedstub.c:71
void ClearContext ( )

Definition at line 944 of file subckt.c.

947 {
948  while (Context) pop_context();
949 }
static struct cc * Context
Definition: subckt.c:28
static int pop_context()
Definition: subckt.c:873
static void edit_cell ( )
static
static void edit_cell ( int  Modified)
static

Definition at line 733 of file subckt.c.

736 {
737  char *TypeIn,*CellName,*NextCellName();
738 
739  SQClear();
740  GPclearGraf(); /* clear graf references */
741  ShowPrompt("Building database. Please wait.");
743  sprintf(TypeOut,"Can't edit cell %s. MORE",Parameters.kpCellName);
745  (void)FBGetchar(ERASE);
746  sprintf(TypeOut,"%s",CDStatusString);
748  Parameters.kpCellName[0] = '\0';
749  }
750  else {
751  if (CDStatusInt == CDNEWSYMBOL) {
752  ShowPrompt("Internal error: cell not found");
753  return;
754  }
755  CenterFullView();
761  sprintf(TypeOut,"Editing: %s",Parameters.kpCellName);
763  Parameters.kpModified = Modified;
764  TitleWindow();
765  }
766 }
void Redisplay()
struct ka * kvCoarseWindow
Definition: sced.h:149
int kpModified
Definition: sced.h:261
void CenterFullView()
Definition: init.c:466
#define ERASE
Definition: scedmacs.h:11
struct s * kpCellDesc
Definition: sced.h:207
#define Not
Definition: cdmacs.h:16
char * kpCellName
Definition: sced.h:210
int CDUnmark()
int CDStatusInt
Definition: cd.c:75
void EraseLargeCoarseViewport()
Definition: viewport.c:583
int CDOpen()
char TypeOut[200]
Definition: init.c:23
struct kp Parameters
Definition: init.c:19
short FBGetchar()
struct kv * View
Definition: init.c:17
int kpShowTerminals
Definition: sced.h:255
void DisplayTerminals()
#define DISPLAY
Definition: scedmacs.h:12
#define CDNEWSYMBOL
Definition: cddefs.h:29
void TitleWindow()
Definition: bascmd.c:704
char * CDStatusString
Definition: cd.c:77
void GPclearGraf()
Definition: grafintr.c:364
void SQClear()
Definition: choose.c:690
char * NextCellName()
Definition: scedintr.c:852
void ShowPrompt(char *str)
Definition: scedstub.c:71
void Flatten ( int *  LookedAhead)

Definition at line 1049 of file subckt.c.

1052 {
1053  struct t *TGen;
1054  struct s *MasterDesc;
1055  struct ks *SQDesc;
1056  struct ks *OldSQDesc;
1057  struct prpty *PDesc;
1058  char *MasterName;
1059  char *TypeIn;
1060  int NumX,NumY;
1061  int Int1,Int2;
1062  int Undo = False;
1063  int Modified = 0;
1064  long X,Y;
1065  long DX,DY;
1066  long TF[9];
1067  struct ka OldSelectQBB;
1068  extern char *MenuFLATN;
1069  extern char *MenuUNDO;
1070 
1071 
1072  if (select_first_call() == NULL) {
1073  ShowPrompt("You haven't selected a subcircuit to flatten.");
1074  return;
1075  }
1076 top:
1077  MenuSelect(MenuFLATN);
1078  SQDesc = SelectQHead;
1079  SQComputeBB();
1080  OldSelectQBB = SelectQBB;
1081 
1082  for (; SQDesc != NULL; SQDesc = SQDesc->ksSucc) {
1083 
1084  if (SQDesc->ksPointer->oType == CDSYMBOLCALL) {
1085  if (SQDesc->ksPointer->oInfo == SQ_GONE) continue;
1086  CDCall(SQDesc->ksPointer,&MasterName,&NumX,&DX,&NumY,&DY);
1087  if (IsCellInLib(MasterName)) continue;
1088 
1089  if (OpenCell(MasterName,&MasterDesc)) continue;
1090 
1091  SetTransform(SQDesc->ksPointer);
1092  TPremultiply();
1093 
1094  for (Int1 = NumY; Int1 >= 1; --Int1) {
1095  for (Int2 = 1; Int2 <= NumX; ++Int2) {
1096  TPush();
1097  TIdentity();
1098  TTranslate((Int2-1)*DX,(Int1-1)*DY);
1099  TPremultiply();
1100  TCurrent(TF);
1101  flatten_cell(MasterDesc);
1102  TPop();
1103  }
1104  }
1105  TPop();
1106  SQDesc->ksPointer->oInfo = SQ_GONE;
1107  Modified++;
1108  }
1109  }
1110  /* take care of instance markers */
1111  OldSelectQBB.kaRight += 600;
1112  OldSelectQBB.kaLeft -= 600;
1113  OldSelectQBB.kaTop += 600;
1114  OldSelectQBB.kaBottom -= 600;
1115  EraseBox(&OldSelectQBB);
1116  Redisplay(&OldSelectQBB);
1117  MenuDeselect(MenuFLATN);
1118  loop {
1119  switch (PointLoop(LookedAhead)) {
1120  case PL_ESC:
1121  case PL_CMD:
1122  goto quit;
1123  case PL_UND:
1124  MenuSelect(MenuUNDO);
1125  if (Undo == False) {
1126  SQRestore(True);
1127  EraseBox(&OldSelectQBB);
1128  Redisplay(&OldSelectQBB);
1129  MenuDeselect(MenuUNDO);
1130  Modified--;
1131  Undo = True;
1132  continue;
1133  }
1134  else {
1135  Undo = False;
1136  MenuDeselect(MenuUNDO);
1137  goto top;
1138  }
1139  }
1140  }
1141 
1142 quit:
1143  SQRestore(False);
1144  if (Modified)
1146 }
#define TF
Definition: ifeval.c:65
static struct o * select_first_call()
Definition: subckt.c:953
#define PL_ESC
Definition: sced.h:62
char * MenuFLATN
Definition: scedintr.c:77
int OpenCell(char *Master, struct s **MasterDesc)
Definition: subckt.c:1279
char * MenuUNDO
Definition: scedintr.c:108
#define loop
Definition: cdmacs.h:11
void Redisplay()
#define SQ_GONE
Definition: sced.h:347
#define PL_UND
Definition: sced.h:63
int kpModified
Definition: sced.h:261
void CDCall()
Definition: cddefs.h:119
struct o * ksPointer
Definition: sced.h:335
void SetTransform()
int PointLoop()
char oType
Definition: cddefs.h:148
void SQRestore()
void TCurrent()
Definition: sced.h:111
void TTranslate()
void Undo()
Definition: bascmd.c:43
#define CDSYMBOLCALL
Definition: cddefs.h:43
long X
Definition: actions.c:450
static void flatten_cell()
void MenuDeselect()
struct ks * ksSucc
Definition: sced.h:334
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
void TPremultiply()
Definition: xforms.c:216
#define True
Definition: scedstub.c:16
void EraseBox()
struct ks * SelectQHead
Definition: scedext.h:64
void TIdentity()
Definition: xforms.c:189
Definition: sced.h:333
#define False
Definition: scedstub.c:15
void TPop()
Definition: xforms.c:64
#define PL_CMD
Definition: sced.h:64
int IsCellInLib()
Definition: cddefs.h:192
void MenuSelect()
long Y
Definition: actions.c:450
Definition: cdprpty.h:62
void ShowPrompt(char *str)
Definition: scedstub.c:71
short oInfo
Definition: cddefs.h:147
void TPush()
Definition: xforms.c:53
struct ka SelectQBB
Definition: scedext.h:65
void SQComputeBB()
Definition: choose.c:749
static void flatten_cell ( )
static
static void flatten_cell ( struct s CellDesc)
static

Definition at line 1150 of file subckt.c.

1153 {
1154  struct g *GenDesc;
1155  struct o *Pointer,*NewPointer;
1156  struct p *Path;
1157  struct t *TGen;
1158  struct s *MasterDesc;
1159  struct prpty *PDesc, *PDesc1;
1160  char *Label;
1161  char *MasterName;
1162  char *TypeIn;
1163  char Xform;
1164  int Layer;
1165  int NumX,NumY;
1166  int Create;
1167  int Int1,Int2;
1168  long X,Y,Width;
1169  long DX,DY;
1170  long TF[9];
1171 
1172  /* mutual inductors */
1173  PDesc = CellDesc->sPrptyList;
1174  for (; PDesc; PDesc = PDesc->prpty_Succ) {
1175  if (PDesc->prpty_Value != P_MUT) continue;
1177  PDesc);
1178  PDesc1 = Parameters.kpCellDesc->sPrptyList; /* just added */
1179  TPoint((long*)&PDesc1->prpty_Data->p_mut.x1,
1180  (long*)&PDesc1->prpty_Data->p_mut.y1);
1181  TPoint((long*)&PDesc1->prpty_Data->p_mut.x2,
1182  (long*)&PDesc1->prpty_Data->p_mut.y2);
1183  PDesc1->prpty_Info = "new"; /* so we know to delete if undo */
1184  }
1185 
1186  /*
1187  * Traverse calls
1188  */
1189  if (Not CDInitGen(CellDesc,0,-CDINFINITY,-CDINFINITY,
1190  CDINFINITY,CDINFINITY,&GenDesc)) MallocFailed();
1191  loop {
1192  CDGen(CellDesc,GenDesc,&Pointer);
1193  if (Pointer == NULL) break;
1194  if (Pointer->oInfo == SQ_GONE) continue;
1195 
1196  CDCall(Pointer,&MasterName,&NumX,&DX,&NumY,&DY);
1197 
1198  if (TFull()) return;
1199 
1200  if (OpenCell(MasterName,&MasterDesc)) return;
1201 
1202  Create = False;
1203  if (IsCellInLib(MasterName)) {
1204  if (Not CDBeginMakeCall(Parameters.kpCellDesc,MasterName,
1205  NumX,DX,NumY,DY,&NewPointer)) MallocFailed();
1206  Create = True;
1207  }
1208 
1209  SetTransform(Pointer);
1210  TPremultiply();
1211 
1212  for (Int1 = NumY; Int1 >= 1; Int1--) {
1213  for (Int2 = 1; Int2 <= NumX; Int2++) {
1214  TPush();
1215  TIdentity();
1216  TTranslate((Int2-1)*DX,(Int1-1)*DY);
1217  TPremultiply();
1218  TCurrent(TF);
1219 
1220  if (!Create) {
1221  flatten_cell(MasterDesc);
1222  }
1223  else {
1224  AddResultingTransform(NewPointer,TF);
1225  if (Not
1226  CDEndMakeCall(Parameters.kpCellDesc,NewPointer))
1227  MallocFailed();
1228  SQInsert(NewPointer);
1229  NewPointer->oInfo = SQ_NEW;
1230 
1231  for (PDesc = Pointer->oPrptyList; PDesc;
1232  PDesc = PDesc->prpty_Succ) {
1233  if (PDesc->prpty_Value == P_VALUE ||
1234  PDesc->prpty_Value == P_MODEL ||
1235  PDesc->prpty_Value == P_INITC) {
1237  NewPointer,PDesc->prpty_Value);
1239  NewPointer,PDesc);
1240  }
1241  }
1242  }
1243  TPop();
1244  }
1245  }
1246  TPop();
1247  }
1248  if (Not CDInitGen(CellDesc,1,-CDINFINITY,-CDINFINITY,
1249  CDINFINITY,CDINFINITY,&GenDesc)) MallocFailed();
1250  loop {
1251  CDGen(CellDesc,GenDesc,&Pointer);
1252  if (Pointer == NULL) break;
1253  if (Pointer->oInfo == SQ_GONE) continue;
1254 
1255  if (Pointer->oType == CDLABEL) {
1256  CDLabel(Pointer,&Layer,&Label,&X,&Y,&Xform);
1257  TPoint(&X,&Y);
1258  if (Not CDMakeLabel(Parameters.kpCellDesc,Layer,Label,
1259  X,Y,Xform,&Pointer)) MallocFailed();
1260  SQInsert(Pointer);
1261  Pointer->oInfo = SQ_NEW;
1262  continue;
1263  }
1264  if (Pointer->oType == CDWIRE) {
1265  CDWire(Pointer,&Layer,&Width,&Path);
1266  CopyPathWithXForm(&Path);
1267  if (Not CDMakeWire(Parameters.kpCellDesc,Layer,Width,Path,
1268  &Pointer)) MallocFailed();
1269  SQInsert(Pointer);
1270  Pointer->oInfo = SQ_NEW;
1271  AssignWireProperties(Pointer);
1272  continue;
1273  }
1274  }
1275 }
struct prpty * sPrptyList
Definition: cddefs.h:133
#define TF
Definition: ifeval.c:65
int OpenCell(char *Master, struct s **MasterDesc)
Definition: subckt.c:1279
#define loop
Definition: cdmacs.h:11
void TPoint()
int struct o * Pointer
Definition: cd.c:1311
int prpty_Value
Definition: cdprpty.h:67
char * prpty_Info
Definition: cdprpty.h:64
#define SQ_GONE
Definition: sced.h:347
#define CDINFINITY
Definition: cddefs.h:70
void CDCall()
void AddResultingTransform()
int CDMakeLabel()
Definition: cddefs.h:119
void SetTransform()
void SQInsert()
char oType
Definition: cddefs.h:148
#define Not
Definition: cdmacs.h:16
struct s * kpCellDesc
Definition: sced.h:207
int x1
Definition: cdprpty.h:31
void TCurrent()
#define P_MODEL
Definition: cdprpty.h:16
void CDGen()
int CDMakeWire()
void TTranslate()
#define P_VALUE
Definition: cdprpty.h:17
int TFull()
Definition: xforms.c:47
void CDWire()
int CDEndMakeCall()
Definition: cddefs.h:215
union prp_data * prpty_Data
Definition: cdprpty.h:65
void MallocFailed()
Definition: scedintr.c:857
long X
Definition: actions.c:450
#define SQ_NEW
Definition: sced.h:350
static void flatten_cell()
int CDInitGen()
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
int y1
Definition: cdprpty.h:32
void TPremultiply()
Definition: xforms.c:216
#define True
Definition: scedstub.c:16
#define P_INITC
Definition: cdprpty.h:18
void CDLabel()
int y2
Definition: cdprpty.h:34
Definition: cddefs.h:142
int CDCopyProperty()
int Layer
Definition: cd.c:1908
void Label()
#define CDWIRE
Definition: cddefs.h:47
#define P_MUT
Definition: cdprpty.h:14
struct prpty * prpty_Succ
Definition: cdprpty.h:66
void AssignWireProperties()
void TIdentity()
Definition: xforms.c:189
int CDRemoveProperty()
Definition: cddefs.h:227
#define False
Definition: scedstub.c:15
void TPop()
Definition: xforms.c:64
int CDBeginMakeCall()
int x2
Definition: cdprpty.h:33
int IsCellInLib()
Definition: cddefs.h:192
struct prp_mut p_mut
Definition: cdprpty.h:53
long Y
Definition: actions.c:450
Definition: cdprpty.h:62
short oInfo
Definition: cddefs.h:147
void CopyPathWithXForm()
void TPush()
Definition: xforms.c:53
struct prpty * oPrptyList
Definition: cddefs.h:146
#define CDLABEL
Definition: cddefs.h:46
static int get_reference_terminal ( )
static
static int get_reference_terminal ( struct s CellDesc,
long *  X,
long*  Y 
)
static

Definition at line 394 of file subckt.c.

399 {
400  struct prpty *PDesc;
401 
402  /* Terminal 0 is the reference point */
403  PDesc = CellDesc->sPrptyList;
404  for (; PDesc; PDesc = PDesc->prpty_Succ) {
405  if (PDesc->prpty_Value != P_NODE) continue;
406  if (PDesc->prpty_Data->p_node.inode == 0) {
407  *X = PDesc->prpty_Data->p_node.x;
408  *Y = PDesc->prpty_Data->p_node.y;
409  return (False); /* success */
410  }
411  }
412  return (True); /* not defined */
413 }
struct prpty * sPrptyList
Definition: cddefs.h:133
int prpty_Value
Definition: cdprpty.h:67
struct prp_node p_node
Definition: cdprpty.h:52
int x
Definition: cdprpty.h:26
#define P_NODE
Definition: cdprpty.h:12
union prp_data * prpty_Data
Definition: cdprpty.h:65
long X
Definition: actions.c:450
#define True
Definition: scedstub.c:16
int y
Definition: cdprpty.h:27
struct prpty * prpty_Succ
Definition: cdprpty.h:66
int inode
Definition: cdprpty.h:25
#define False
Definition: scedstub.c:15
long Y
Definition: actions.c:450
Definition: cdprpty.h:62
void InitDeviceMenu ( )

Definition at line 70 of file subckt.c.

72 {
73  if (DeviceMenu == NULL)
74  DeviceMenu = (MENU *) malloc(DefMenuSize*sizeof(MENU));
75  if (DeviceMenu == NULL) MallocFailed();
76  memset(DeviceMenu,0,DefMenuSize*sizeof(MENU));
77 
80  if (DeviceMenu[0].mEntry == NULL)
81  ShowPrompt("No device library found!");
83  if (DeviceMenu[0].mEntry == NULL)
84  ShowPrompt("No device library found, and no subcircuits!");
85 }
void SetLibraryChoices()
Definition: library.c:140
static void set_subckt_list()
Definition: subckt.c:267
char * malloc()
static void set_subckt_choices()
Definition: subckt.c:305
void MallocFailed()
Definition: scedintr.c:857
#define NULL
Definition: spdefs.h:121
#define DefMenuSize
Definition: scedext.h:555
MENU * DeviceMenu
Definition: scedintr.c:50
Definition: sced.h:363
void ShowPrompt(char *str)
Definition: scedstub.c:71
static struct o* make_array ( )
static
static struct o* make_array ( long  X,
long  Y 
)
static

Definition at line 335 of file subckt.c.

338 {
339  struct o *Pointer;
340  struct ka BB;
341  int NumX,NumY;
342  long XX,YY;
343  long L,R,T,B;
344  double DX,DY;
345 
346  NumX = Parameters.kpNumX;
347  NumY = Parameters.kpNumY;
348  DX = Parameters.kpDX;
349  DY = Parameters.kpDY;
350 
351  CDBB(CurInstance.Desc,(struct o *)NULL,&L,&B,&R,&T);
352 
354  R-L+(long)DX*RESOLUTION,NumY,T-B+(long)DY*RESOLUTION,&Pointer)) {
355  MallocFailed();
356  }
357 
358  /* Find translation so cell is always placed with lower left corner
359  * at reference point or use the subckt's nodal reference point if
360  * defined. */
361  XX = L;
362  YY = B;
363  (void)get_reference_terminal(CurInstance.Desc,&XX,&YY);
364  if (XX != 0 || YY != 0)
365  Mtest(CDT(Pointer,CDTRANSLATE,-XX,-YY));
366 
367  if (Parameters.kpMX)
368  Mtest(CDT(Pointer,CDMIRRORX,0L,0L));
369  if (Parameters.kpMY)
370  Mtest(CDT(Pointer,CDMIRRORY,0L,0L));
371  if (Parameters.kpRotationAngle == 90) {
372  Mtest(CDT(Pointer,CDROTATE,0L,1L));
373  }
374  elif (Parameters.kpRotationAngle == 180) {
375  Mtest(CDT(Pointer,CDROTATE,-1L,0L));
376  }
377  elif (Parameters.kpRotationAngle == 270) {
378  Mtest(CDT(Pointer,CDROTATE,0L,-1L));
379  }
380 
381  Mtest(CDT(Pointer,CDTRANSLATE,X,Y));
383 
384  /* CDBB will always return True if Pointer != NULL */
386  &BB.kaLeft,&BB.kaBottom,&BB.kaRight,&BB.kaTop);
387  EraseBox(&BB);
388  Redisplay(&BB);
389  return (Pointer);
390 }
void Redisplay()
int struct o * Pointer
Definition: cd.c:1311
struct s * kpCellDesc
Definition: sced.h:207
#define Not
Definition: cdmacs.h:16
int CDStatusInt
Definition: cd.c:75
static struct rd CurInstance
Definition: subckt.c:40
Definition: sced.h:111
#define L
Definition: parse.c:442
int CDEndMakeCall()
double kpDY
Definition: sced.h:228
int CDT()
void MallocFailed()
Definition: scedintr.c:857
long X
Definition: actions.c:450
int kpMY
Definition: sced.h:284
#define R
Definition: parse.c:444
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
#define elif
Definition: cdmacs.h:10
int kpNumY
Definition: sced.h:226
#define CDROTATE
Definition: cddefs.h:55
#define RESOLUTION
Definition: sced.h:36
int kpRotationAngle
Definition: sced.h:282
void EraseBox()
#define Mtest(zap)
Definition: subckt.c:30
char Name[82]
Definition: subckt.c:38
Definition: cddefs.h:142
int kpNumX
Definition: sced.h:225
int kpMX
Definition: sced.h:283
#define CDTRANSLATE
Definition: cddefs.h:56
double kpDX
Definition: sced.h:227
int CDBB()
struct s * Desc
Definition: subckt.c:36
int CDBeginMakeCall()
static int get_reference_terminal()
#define CDMIRRORY
Definition: cddefs.h:54
#define CDMIRRORX
Definition: cddefs.h:53
long Y
Definition: actions.c:450
int MutSelected ( struct prpty PDesc)

Definition at line 592 of file subckt.c.

596 {
597  long x1,y1,x2,y2;
598  struct ks *sq;
599  struct o *p1, *p2;
600  struct g *GenDesc;
601  int found1, found2;
602  char *name;
603 
604  x1 = PDesc->prpty_Data->p_mut.x1;
605  y1 = PDesc->prpty_Data->p_mut.y1;
606  x2 = PDesc->prpty_Data->p_mut.x2;
607  y2 = PDesc->prpty_Data->p_mut.y2;
608 
610  x1,y1,x1,y1,&GenDesc)) MallocFailed();
611 
612  loop {
613  CDGen(Parameters.kpCellDesc,GenDesc,&p1);
614  if (p1 == NULL) break;
615  if (p1->oInfo == SQ_GONE) continue;
616  name = ((struct c *)p1->oRep)->cMaster->mName;
617  if (!cieq(name,"ind")) continue;
618  tfree(GenDesc);
619  break;
620  }
621  if (p1 == NULL) return (False);
622 
624  x2,y2,x2,y2,&GenDesc)) MallocFailed();
625 
626  loop {
627  CDGen(Parameters.kpCellDesc,GenDesc,&p2);
628  if (p2 == NULL) break;
629  if (p2->oInfo == SQ_GONE) continue;
630  name = ((struct c *)p2->oRep)->cMaster->mName;
631  if (!cieq(name,"ind")) continue;
632  tfree(GenDesc);
633  break;
634  }
635  if (p2 == NULL) return (False);
636 
637  found1 = found2 = False;
638  for (sq = SelectQHead; sq; sq = sq->ksSucc) {
639  if (sq->ksPointer->oType != CDSYMBOLCALL) continue;
640  if (sq->ksPointer->oInfo == SQ_GONE) continue;
641  if (p1 == sq->ksPointer)
642  found1 = True;
643  if (p2 == sq->ksPointer)
644  found2 = True;
645  }
646  if (found1 && found2)
647  return (True);
648  return (False);
649 }
#define loop
Definition: cdmacs.h:11
#define SQ_GONE
Definition: sced.h:347
int cieq()
struct o * ksPointer
Definition: sced.h:335
char oType
Definition: cddefs.h:148
struct s * kpCellDesc
Definition: sced.h:207
#define Not
Definition: cdmacs.h:16
int x1
Definition: cdprpty.h:31
void CDGen()
union prp_data * prpty_Data
Definition: cdprpty.h:65
void MallocFailed()
Definition: scedintr.c:857
#define CDSYMBOLCALL
Definition: cddefs.h:43
#define tfree(x)
Definition: cdmacs.h:22
int CDInitGen()
struct ks * ksSucc
Definition: sced.h:334
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
int y1
Definition: cdprpty.h:32
#define True
Definition: scedstub.c:16
int y2
Definition: cdprpty.h:34
struct o * oRep
Definition: cddefs.h:144
Definition: cddefs.h:142
struct ks * SelectQHead
Definition: scedext.h:64
Definition: cddefs.h:177
Definition: sced.h:333
Definition: cddefs.h:227
#define False
Definition: scedstub.c:15
int x2
Definition: cdprpty.h:33
struct prp_mut p_mut
Definition: cdprpty.h:53
short oInfo
Definition: cddefs.h:147
void NewSubckt ( )

Definition at line 89 of file subckt.c.

91 {
92  char *TypeIn;
93  int i;
94  struct s *MasterDesc;
95 
97  ShowPrompt("New subcircuit name? ");
98  TypeIn = FBEdit(NULL);
99  if (TypeIn == NULL || *TypeIn == '\0') {
101  return;
102  }
103 
104  /* strip off any path prefix */
105  if (FixCellName(TypeIn)) {
106  ShowPromptAndWait("Warning: internal path overflow");
107  }
108 
109  if (OpenCell(TypeIn,&MasterDesc)) {
110  ShowPrompt("Bad subcell name, not found or error.");
112  return;
113  }
114  for (i = 0; i < 80 && SubCktList[i]; i++)
115  if (!strcmp(SubCktList[i],TypeIn)) break;
116  if (i < 80 && SubCktList[i] == NULL)
117  SubCktList[i] = CopyString(TypeIn);
118 
122  ShowCommandMenu();
123  ErasePrompt();
124 }
void ErasePrompt()
Definition: viewport.c:538
int OpenCell(char *Master, struct s **MasterDesc)
Definition: subckt.c:1279
void SetLibraryChoices()
Definition: library.c:140
Definition: cddefs.h:119
char * CopyString()
static char * SubCktList[80]
Definition: subckt.c:33
static void set_subckt_choices()
Definition: subckt.c:305
void ShowPromptAndWait()
void ShowCommandMenu()
Definition: viewport.c:121
void MenuDeselect()
#define NULL
Definition: spdefs.h:121
char * MenuNEWSC
Definition: scedintr.c:92
int FixCellName()
char * FBEdit()
void MenuSelect()
void ShowPrompt(char *str)
Definition: scedstub.c:71
void NewSymbol ( )

Definition at line 417 of file subckt.c.

422 {
423  struct ks *SQDesc;
424  struct o *Pointer;
425  struct t *TGen;
426  struct p *Path;
427  struct prpty *PDesc;
428  FILE *FileDesc;
429  char *TypeIn;
430  char *Label;
431  char Type;
432  char Xform;
433  char *SymbolName;
434  int Layer;
435  int NumX,NumY;
436  long X,Y,DX,DY,Width,Length;
437  long Xo, Yo;
438  extern char *MenuCRSYM;
439 
440  MenuSelect(MenuCRSYM);
441  if (SelectQHead == NULL) {
442  ShowPrompt("Objects must be selected first.");
443  MenuDeselect(MenuCRSYM);
444  return;
445  }
446  ShowPrompt("Name of new symbol? ");
447  if ((TypeIn = FBEdit(NULL)) == NULL Or *TypeIn == '\0') {
448  ErasePrompt();
449  MenuDeselect(MenuCRSYM);
450  return;
451  }
452  if ((FileDesc = POpen(TypeIn,"w",(char **)NULL)) == NULL) {
453  sprintf(TypeOut,"Can't create symbol %s.",TypeIn);
455  MenuDeselect(MenuCRSYM);
456  return;
457  }
458  SQComputeBB();
459  /* The new cell origin will be the lower left corner */
460  Xo = SelectQBB.kaLeft;
461  Yo = SelectQBB.kaBottom;
462  fprintf(FileDesc,"(Symbol %s);\n",TypeIn);
463  fprintf(FileDesc,"9 %s;\n",TypeIn);
464 
465  /* catch mutual inductors if both selected */
467  for (; PDesc; PDesc = PDesc->prpty_Succ) {
468  if (PDesc->prpty_Value != P_MUT) continue;
469  if (MutSelected(PDesc)) {
470  fprintf(FileDesc,"5 %d %d %d %d %d %g;\n",
471  P_MUT,PDesc->prpty_Data->p_mut.x1,
472  PDesc->prpty_Data->p_mut.y1,
473  PDesc->prpty_Data->p_mut.x2,
474  PDesc->prpty_Data->p_mut.y2,
475  PDesc->prpty_Data->p_mut.coeff);
476  }
477  }
478 
479  GenBeginSymbol(FileDesc,0,1L,1L);
480 
481  for (SQDesc = SelectQHead; SQDesc; SQDesc = SQDesc->ksSucc) {
482  Pointer = SQDesc->ksPointer;
483  if (Pointer->oType == CDSYMBOLCALL) {
484 
485  CDCall(Pointer,&SymbolName,&NumX,&DX,&NumY,&DY);
486  /* add symbol name extension */
487  fprintf(FileDesc,"9 %s;\n",SymbolName);
488 
489  /* property list info */
490  for (PDesc = Pointer->oPrptyList; PDesc;
491  PDesc = PDesc->prpty_Succ) {
492 
493  switch (PDesc->prpty_Value) {
494  case P_NODE:
495  fprintf(FileDesc,"5 %d %d %d %ld %ld;\n",
496  P_NODE,-1,PDesc->prpty_Data->p_node.inode,
497  PDesc->prpty_Data->p_node.x-Xo,
498  PDesc->prpty_Data->p_node.y-Yo);
499  continue;
500  case P_MUT:
501  fprintf(FileDesc,"5 %d %d %d %d %d %g;\n",
502  P_MUT,PDesc->prpty_Data->p_mut.x1,
503  PDesc->prpty_Data->p_mut.y1,
504  PDesc->prpty_Data->p_mut.x2,
505  PDesc->prpty_Data->p_mut.y2,
506  PDesc->prpty_Data->p_mut.coeff);
507  continue;
508  case P_BRANCH:
509  fprintf(FileDesc,"5 %d %ld %ld %d %d;\n",
510  P_BRANCH,PDesc->prpty_Data->p_branch.x-Xo,
511  PDesc->prpty_Data->p_branch.y-Yo,
512  PDesc->prpty_Data->p_branch.r1,
513  PDesc->prpty_Data->p_branch.r2);
514  continue;
515  case P_NAME:
516  if (PDesc->prpty_Data->p_name.subname)
517  fprintf(FileDesc,"5 %d %s %d %s;\n",
518  P_NAME,PDesc->prpty_Data->p_name.name,
519  PDesc->prpty_Data->p_name.num,
520  PDesc->prpty_Data->p_name.subname);
521  else
522  fprintf(FileDesc,"5 %d %s %d;\n",
523  P_NAME,PDesc->prpty_Data->p_name.name,
524  PDesc->prpty_Data->p_name.num);
525  continue;
526  case P_MODEL:
527  case P_VALUE:
528  case P_INITC:
529  fprintf(FileDesc,"5 %d %s;\n",PDesc->prpty_Value,
530  HYtoascii((struct hprlist*)PDesc->prpty_Data));
531  continue;
532  }
533  }
534 
535  /* add symbol array extension */
536  if (NumX != 1 Or NumY != 1)
537  fprintf(FileDesc,"1 Array %d %ld %d %ld;\n",NumX,DX,NumY,DY);
538  fprintf(FileDesc,"C 0");
539  CDInitTGen(Pointer,&TGen);
540  loop {
541  CDTGen(&TGen,&Type,&X,&Y);
542  if (TGen == NULL) {
543  fprintf(FileDesc,";\n");
544  break;
545  }
546  elif (Type == CDROTATE)
547  fprintf(FileDesc," R %ld %ld",X,Y);
548  elif (Type == CDTRANSLATE)
549  fprintf(FileDesc," T %ld %ld",X-Xo,Y-Yo);
550  elif (Type == CDMIRRORX)
551  fprintf(FileDesc," MX");
552  elif (Type == CDMIRRORY)
553  fprintf(FileDesc," MY");
554  }
555  }
556  }
557 
558  GenLayer(FileDesc,'S',"CED");
559  for (SQDesc = SelectQHead; SQDesc; SQDesc = SQDesc->ksSucc) {
560  Pointer = SQDesc->ksPointer;
561  if (Pointer->oInfo == SQ_GONE) continue;
562 
563  if (Pointer->oType == CDWIRE) {
564  CDWire(Pointer,&Layer,&Width,&Path);
565  fprintf(FileDesc,"5 %d -1 0 0 0;\n",P_NODE);
566  GenWireOffset(FileDesc,Width,Path,Xo,Yo);
567  continue;
568  }
569  elif (Pointer->oType == CDPOLYGON) {
570  CDPolygon(Pointer,&Layer,&Path);
571  GenPolygonOffset(FileDesc,Path,Xo,Yo);
572  continue;
573  }
574  elif (Pointer->oType == CDLABEL) {
575  CDLabel(Pointer,&Layer,&Label,&X,&Y,&Xform);
576  fprintf(FileDesc,"94 %s %ld %ld %d",Label,X-Xo,Y-Yo,Xform);
577  fprintf(FileDesc,";\n");
578  continue;
579  }
580  }
581 
582  GenEndSymbol(FileDesc);
583  GenEnd(FileDesc);
584  fclose(FileDesc);
585  sprintf(TypeOut,"New symbol %s created and saved.",TypeIn);
586  MenuDeselect(MenuCRSYM);
588 }
struct prpty * sPrptyList
Definition: cddefs.h:133
void ErasePrompt()
Definition: viewport.c:538
#define loop
Definition: cdmacs.h:11
int struct o * Pointer
Definition: cd.c:1311
#define Or
Definition: cdmacs.h:15
int prpty_Value
Definition: cdprpty.h:67
#define SQ_GONE
Definition: sced.h:347
char * HYtoascii()
void CDCall()
void MY()
Definition: choose.c:67
struct o * ksPointer
Definition: sced.h:335
int MutSelected(struct prpty *PDesc)
Definition: subckt.c:592
char oType
Definition: cddefs.h:148
long kaBottom
Definition: sced.h:112
struct s * kpCellDesc
Definition: sced.h:207
int x1
Definition: cdprpty.h:31
struct prp_node p_node
Definition: cdprpty.h:52
#define P_MODEL
Definition: cdprpty.h:16
void CDPolygon()
int x
Definition: cdprpty.h:26
void GenPolygonOffset()
#define P_NODE
Definition: cdprpty.h:12
void GenBeginSymbol()
#define P_VALUE
Definition: cdprpty.h:17
#define P_BRANCH
Definition: cdprpty.h:15
void CDWire()
#define L
Definition: parse.c:442
Definition: cddefs.h:215
Definition: sced.h:193
int x
Definition: cdprpty.h:39
void GenEndSymbol()
union prp_data * prpty_Data
Definition: cdprpty.h:65
int r2
Definition: cdprpty.h:42
#define CDSYMBOLCALL
Definition: cddefs.h:43
long X
Definition: actions.c:450
void MenuDeselect()
#define R
Definition: parse.c:444
struct ks * ksSucc
Definition: sced.h:334
#define NULL
Definition: spdefs.h:121
char TypeOut[200]
Definition: init.c:23
struct kp Parameters
Definition: init.c:19
void GenWireOffset()
int y1
Definition: cdprpty.h:32
#define elif
Definition: cdmacs.h:10
#define P_INITC
Definition: cdprpty.h:18
#define CDROTATE
Definition: cddefs.h:55
char * subname
Definition: cdprpty.h:48
void CDLabel()
int y2
Definition: cdprpty.h:34
long kaLeft
Definition: sced.h:112
int y
Definition: cdprpty.h:27
Definition: cddefs.h:142
#define P_NAME
Definition: cdprpty.h:13
int y
Definition: cdprpty.h:40
struct prp_branch p_branch
Definition: cdprpty.h:54
struct ks * SelectQHead
Definition: scedext.h:64
int Layer
Definition: cd.c:1908
void Label()
#define CDWIRE
Definition: cddefs.h:47
#define P_MUT
Definition: cdprpty.h:14
int num
Definition: cdprpty.h:47
struct prpty * prpty_Succ
Definition: cdprpty.h:66
int r1
Definition: cdprpty.h:41
Definition: sced.h:333
#define CDTRANSLATE
Definition: cddefs.h:56
char * name
Definition: cdprpty.h:46
char * FBEdit()
int inode
Definition: cdprpty.h:25
char * MenuCRSYM
Definition: scedintr.c:70
void MX()
Definition: choose.c:52
double coeff
Definition: cdprpty.h:35
int char Type
Definition: actions.c:449
struct prp_name p_name
Definition: cdprpty.h:55
int x2
Definition: cdprpty.h:33
#define CDMIRRORY
Definition: cddefs.h:54
FILE * POpen()
Definition: cddefs.h:192
#define CDMIRRORX
Definition: cddefs.h:53
void MenuSelect()
struct prp_mut p_mut
Definition: cdprpty.h:53
long Y
Definition: actions.c:450
Definition: cdprpty.h:62
void ShowPrompt(char *str)
Definition: scedstub.c:71
#define CDPOLYGON
Definition: cddefs.h:44
short oInfo
Definition: cddefs.h:147
void GenLayer()
void CDTGen()
struct ka SelectQBB
Definition: scedext.h:65
void GenEnd()
struct prpty * oPrptyList
Definition: cddefs.h:146
void SQComputeBB()
Definition: choose.c:749
void CDInitTGen()
#define CDLABEL
Definition: cddefs.h:46
int OpenCell ( char *  Master,
struct s **  MasterDesc 
)

Definition at line 1279 of file subckt.c.

1283 {
1284  char *TypeIn;
1285 
1286  if (Not CDOpen(Master,MasterDesc,'r')) {
1287  if (CDStatusInt == CDPARSEFAILED) {
1288  sprintf(TypeOut,"Can't display circuit %s. MORE",Master);
1290  (void)FBGetchar(ERASE);
1292  }
1293  if (CDStatusInt == CDMALLOCFAILED)
1294  MallocFailed();
1295  return (True);
1296  }
1297  if (CDStatusInt == CDNEWSYMBOL) {
1298  sprintf(TypeOut,
1299  "Can't display circuit %s, because it doesn't seem to be around.",
1300  Master);
1302  return (True);
1303  }
1304  return (False);
1305 }
#define ERASE
Definition: scedmacs.h:11
#define Not
Definition: cdmacs.h:16
int CDStatusInt
Definition: cd.c:75
#define CDPARSEFAILED
Definition: cddefs.h:27
int CDOpen()
void MallocFailed()
Definition: scedintr.c:857
char TypeOut[200]
Definition: init.c:23
#define True
Definition: scedstub.c:16
short FBGetchar()
#define CDMALLOCFAILED
Definition: cddefs.h:35
#define CDNEWSYMBOL
Definition: cddefs.h:29
char * CDStatusString
Definition: cd.c:77
#define False
Definition: scedstub.c:15
void ShowPrompt(char *str)
Definition: scedstub.c:71
void Place ( int *  LookedAhead)

Definition at line 128 of file subckt.c.

131 {
132  char *TypeIn;
133  struct o *Pointer = NULL;
134  struct s *MasterDesc;
135  struct ka BB;
136  long X,Y;
137  int Undo = False;
138  int modified = 0;
139  int i;
140 
141  /* the cell name is hidden in the command string */
142  TypeIn = Parameters.kpCommand;
143  while (*TypeIn) TypeIn++;
144  TypeIn++;
145  strcpy(CurInstance.Name,TypeIn);
147 
148  if (OpenCell(CurInstance.Name,&MasterDesc)) {
149  ShowPrompt("Bad subcell name, not found or error.");
151  return;
152  }
153  CurInstance.Desc = MasterDesc;
155  ShowPrompt("Point to locations to place cell.");
156  FBSetRubberBanding('p');
157 
158  loop {
159  switch (PointLoop(LookedAhead)) {
160 
161  case PL_CMD:
162  case PL_ESC:
163  goto quit;
164 
165  case PL_UND:
166  *LookedAhead = False;
167  if (Pointer == NULL)
168  continue;
170  if (Undo == False) {
172  &BB.kaLeft,&BB.kaBottom,&BB.kaRight,&BB.kaTop);
173  EraseBox(&BB);
174  CDDelete(Parameters.kpCellDesc,Pointer);
175  Redisplay(&BB);
176  modified--;
177  Undo = True;
178  }
179  else {
181  Pointer = make_array(X,Y);
182  FBSetRubberBanding('p');
183  modified++;
184  Undo = False;
185  }
187  continue;
188 
189  case PL_PCW:
190  X = SCursor.kcX;
191  Y = SCursor.kcY;
193  Pointer = make_array(X,Y);
194  FBSetRubberBanding('p');
195  modified++;
196  Undo = False;
197  continue;
198  }
199  }
200 
201 quit:
204  ErasePrompt();
205  if (modified)
207 }
#define PL_ESC
Definition: sced.h:62
void ErasePrompt()
Definition: viewport.c:538
int OpenCell(char *Master, struct s **MasterDesc)
Definition: subckt.c:1279
char * MenuUNDO
Definition: scedintr.c:108
#define loop
Definition: cdmacs.h:11
void Redisplay()
int struct o * Pointer
Definition: cd.c:1311
int DevLib
Definition: subckt.c:37
static struct o * make_array()
#define PL_UND
Definition: sced.h:63
int kpModified
Definition: sced.h:261
char * strcpy()
Definition: cddefs.h:119
int PointLoop()
struct kc SCursor
Definition: init.c:21
struct s * kpCellDesc
Definition: sced.h:207
int CDStatusInt
Definition: cd.c:75
static struct rd CurInstance
Definition: subckt.c:40
#define PL_PCW
Definition: sced.h:65
#define CDDelete
Definition: cddefs.h:19
Definition: sced.h:111
long kcY
Definition: sced.h:102
void Undo()
Definition: bascmd.c:43
char * kpCommand
Definition: sced.h:219
long X
Definition: actions.c:450
void MenuDeselect()
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
#define True
Definition: scedstub.c:16
void EraseBox()
void MenuDeselectDev()
char Name[82]
Definition: subckt.c:38
Definition: cddefs.h:142
void MenuSelectDev()
long kcX
Definition: sced.h:102
void FBSetRubberBanding()
int CDBB()
struct s * Desc
Definition: subckt.c:36
#define False
Definition: scedstub.c:15
#define PL_CMD
Definition: sced.h:64
int IsCellInLib()
void MenuSelect()
long Y
Definition: actions.c:450
void ShowPrompt(char *str)
Definition: scedstub.c:71
void Pop ( )

Definition at line 829 of file subckt.c.

831 {
832  int i;
833  struct s *CellDesc;
834  char *TypeIn;
835  extern char *MenuPOP;
836 
837  MenuSelect(MenuPOP);
838  if (Context == NULL)
839  ShowPrompt("There isn't a context to pop to.");
840 
841  else {
842  SQClear();
843  if (WroteCell) {
844  /*
845  * Restore cell to its old state, because we don't want
846  * a global change, but we want a change to the instance
847  * pushed from.
848  */
850  }
851  if (Parameters.kpModified) {
852  ShowPrompt("You've modified this cell. Do you want to save it (y)?");
853  TypeIn = FBEdit(NULL);
854  if (TypeIn == NULL)
855  goto quit;
856  if (TypeIn[0] != 'n' && TypeIn[0] != 'N')
857  WriteCell();
858  }
859  WroteCell = False;
863  MallocFailed();
865  }
866 quit:
867  TitleWindow();
868  MenuDeselect(MenuPOP);
869 }
int kpModified
Definition: sced.h:261
Definition: cddefs.h:119
#define ERASE
Definition: scedmacs.h:11
struct s * kpCellDesc
Definition: sced.h:207
#define Not
Definition: cdmacs.h:16
static struct cc * Context
Definition: subckt.c:28
void WriteCell()
Definition: bascmd.c:740
void MallocFailed()
Definition: scedintr.c:857
int CDClose()
void MenuDeselect()
#define NULL
Definition: spdefs.h:121
static void edit_cell()
struct kp Parameters
Definition: init.c:19
int kpShowTerminals
Definition: sced.h:255
void DisplayTerminals()
char * MenuPOP
Definition: scedintr.c:95
void TitleWindow()
Definition: bascmd.c:704
static int pop_context()
Definition: subckt.c:873
char * FBEdit()
#define False
Definition: scedstub.c:15
void SQClear()
Definition: choose.c:690
void MenuSelect()
void ShowPrompt(char *str)
Definition: scedstub.c:71
static int WroteCell
Definition: subckt.c:32
static int pop_context ( )
static

Definition at line 873 of file subckt.c.

875 {
876  struct kw *Tmp;
877  struct cc *Old;
878  int Modified;
879 
883 
884  for (Tmp = Parameters.kpWindowStack; Tmp;
885  Tmp = Parameters.kpWindowStack) {
887  tfree(Tmp);
888  }
891  TPush();
893  TStore();
894  TPop();
895  SetPositioning();
897  Modified = Context->ccModified;
898  Old = Context;
900  tfree(Old);
901  return (Modified);
902 }
struct kw * kpWindowStack
Definition: sced.h:222
long ccWidth
Definition: subckt.c:19
Definition: subckt.c:18
long ccY
Definition: subckt.c:19
int kpModified
Definition: sced.h:261
char * strcpy()
void InitCoarseWindow()
char * kpCellName
Definition: sced.h:210
char * ccMaster
Definition: subckt.c:23
static struct cc * Context
Definition: subckt.c:28
void TStore()
Definition: xforms.c:331
int ccModified
Definition: subckt.c:20
#define tfree(x)
Definition: cdmacs.h:22
struct kw * ccSaveWindow
Definition: subckt.c:21
struct kp Parameters
Definition: init.c:19
void InitFineWindow()
void TLoadCurrent()
struct cc * ccNext
Definition: subckt.c:25
void SetPositioning()
Definition: init.c:322
struct kw * kwNext
Definition: sced.h:137
#define False
Definition: scedstub.c:15
void TPop()
Definition: xforms.c:64
long ccX
Definition: subckt.c:19
Definition: sced.h:130
void TPush()
Definition: xforms.c:53
void free()
long ccXform[9]
Definition: subckt.c:24
void Push ( int *  LookedAhead)

Definition at line 653 of file subckt.c.

656 {
657  struct o *Pointer;
658  struct t *TGen;
659  struct cc *New;
660  char Type;
661  char *MasterName;
662  int i,NumX,NumY;
663  long DX,DY;
664  long X,Y;
665  extern char *MenuPUSH;
666 
667  MenuSelect(MenuPUSH);
668  WroteCell = False;
669  Pointer = select_first_call();
670  loop {
671  /*
672  * Fetch first call desc in select Q if any.
673  * Its master is the cell we will push to.
674  * Otherwise, point to select an instance;
675  */
676  if (Pointer != NULL) break;
677 
678  ShowPrompt("Point to instance to push to ");
679  switch (PointLoop(LookedAhead)) {
680  case PL_ESC:
681  case PL_CMD:
682  case PL_UND:
683  ErasePrompt();
684  MenuDeselect(MenuPUSH);
685  return;
686  case PL_PCW:
688  }
689  }
690  ErasePrompt();
691  CDCall(Pointer,&MasterName,&NumX,&DX,&NumY,&DY);
692  New = alloc(cc);
693  if (New == NULL) MallocFailed();
695  New->ccInst = Pointer;
696  New->ccX = View->kvCoarseWindow->kaX;
697  New->ccY = View->kvCoarseWindow->kaY;
701  New->ccNext = Context;
702  Context = New;
703  strcpy(Parameters.kpCellName,MasterName);
706 
707  /* find the inverse transform of the cell, used when displaying
708  * context */
709  TPush();
710  TLoad(); /* load the current inverse transform */
711  TCurrent(New->ccXform);
712  TInverse(); /* compute the inverse (actual transform) */
713  TLoadInverse(); /* load it */
714 
715  SetTransform(Pointer);
716  TPremultiply();
717 
718  TInverse(); /* compute the inverse */
719  TLoadInverse(); /* load it */
720  TStore(); /* save it for use in redisplay() */
721  TPop();
722  TPop();
723 
726  edit_cell(False);
727  TitleWindow();
728  MenuDeselect(MenuPUSH);
729 }
struct kw * kpWindowStack
Definition: sced.h:222
static struct o * select_first_call()
Definition: subckt.c:953
#define PL_ESC
Definition: sced.h:62
void ErasePrompt()
Definition: viewport.c:538
long kaY
Definition: sced.h:113
long ccWidth
Definition: subckt.c:19
#define loop
Definition: cdmacs.h:11
int struct o * Pointer
Definition: cd.c:1311
Definition: subckt.c:18
void TInverse()
Definition: xforms.c:271
long ccY
Definition: subckt.c:19
long kcRawY
Definition: sced.h:103
struct ka * kvCoarseWindow
Definition: sced.h:149
#define PL_UND
Definition: sced.h:63
int kpModified
Definition: sced.h:261
void CDCall()
long kcRawX
Definition: sced.h:103
char * strcpy()
void SetTransform()
char * CopyString()
char * MenuPUSH
Definition: scedintr.c:98
void TLoadInverse()
Definition: xforms.c:345
int PointLoop()
struct kc SCursor
Definition: init.c:21
#define ERASE
Definition: scedmacs.h:11
char * kpCellName
Definition: sced.h:210
void TCurrent()
#define PL_PCW
Definition: sced.h:65
char * ccMaster
Definition: subckt.c:23
static struct cc * Context
Definition: subckt.c:28
#define alloc(type)
Definition: cdmacs.h:21
void TStore()
Definition: xforms.c:331
void MallocFailed()
Definition: scedintr.c:857
long X
Definition: actions.c:450
int ccModified
Definition: subckt.c:20
void MenuDeselect()
struct kw * ccSaveWindow
Definition: subckt.c:21
#define NULL
Definition: spdefs.h:121
static void edit_cell()
struct kp Parameters
Definition: init.c:19
static struct o * select_call()
void TPremultiply()
Definition: xforms.c:216
struct kv * View
Definition: init.c:17
int kpShowTerminals
Definition: sced.h:255
void DisplayTerminals()
Definition: cddefs.h:142
struct cc * ccNext
Definition: subckt.c:25
void TitleWindow()
Definition: bascmd.c:704
double kaWidth
Definition: sced.h:114
int char Type
Definition: actions.c:449
#define False
Definition: scedstub.c:15
void TPop()
Definition: xforms.c:64
long ccX
Definition: subckt.c:19
#define PL_CMD
Definition: sced.h:64
Definition: cddefs.h:192
void MenuSelect()
long Y
Definition: actions.c:450
void ShowPrompt(char *str)
Definition: scedstub.c:71
void TPush()
Definition: xforms.c:53
static int WroteCell
Definition: subckt.c:32
long ccXform[9]
Definition: subckt.c:24
long kaX
Definition: sced.h:113
void TLoad()
Definition: xforms.c:338
struct o * ccInst
Definition: subckt.c:22
static struct o* select_call ( )
static
static struct o* select_call ( long  X,
long  Y 
)
static

Definition at line 972 of file subckt.c.

976 {
977  struct g *GenDesc;
978  struct o *Pointer,*Found;
979  int Count = 0;
980  char *name;
981  char OldMenu;
982 
984  X,Y,X,Y,&GenDesc)) MallocFailed();
985 
986  loop {
987  CDGen(Parameters.kpCellDesc,GenDesc,&Pointer);
988  if (Pointer == NULL) break;
989  if (Pointer->oInfo == SQ_GONE) continue;
990 
991  name = ((struct c *)Pointer->oRep)->cMaster->mName;
992  if (IsCellInLib(name)) continue;
993  /* found a subcircuit */
994  Count++;
995  AmbiguityMenu[Count].mEntry = name;
996  Found = Pointer;
997  }
998  if (Count == 0)
999  return (NULL);
1000  if (Count == 1)
1001  return (Found);
1002  AmbiguityMenu[Count].mEntry = NULL;
1004 
1005  OldMenu = Parameters.kpMenu;
1008 
1009  /* Which instance is user interested in? */
1010  ShowPrompt("Point to the name of the subcircuit you want selected.");
1011  loop {
1012  int dummy;
1013  switch (PointLoopSafe(&dummy)) {
1014  case PL_ESC:
1015  break;
1016  case PL_CMD:
1017  break;
1018  case PL_PCW:
1019  ShowPrompt("You aren't pointing at the menu.");
1020  continue;
1021  }
1022  break;
1023  }
1024  Parameters.kpMenu = OldMenu;
1025  ErasePrompt();
1026  ShowCommandMenu();
1027 
1028  if (Parameters.kpCommand[1] == ESCAPE) return (NULL);
1030  X,Y,X,Y,&GenDesc)) MallocFailed();
1031 
1032  loop {
1033  CDGen(Parameters.kpCellDesc,GenDesc,&Pointer);
1034  if (Pointer == NULL) break;
1035  if (Pointer->oInfo == SQ_GONE) continue;
1036 
1037  name = ((struct c *)Pointer->oRep)->cMaster->mName;
1038  if (cieq(name,Parameters.kpCommand)) {
1039  tfree(GenDesc);
1040  return (Pointer);
1041  }
1042  }
1043  /* shouldn't get here */
1044  return (NULL);
1045 }
#define PL_ESC
Definition: sced.h:62
void ErasePrompt()
Definition: viewport.c:538
#define loop
Definition: cdmacs.h:11
int struct o * Pointer
Definition: cd.c:1311
#define SQ_GONE
Definition: sced.h:347
int cieq()
static void dummy()
Definition: mfbcursr.c:550
int PointLoopSafe()
struct s * kpCellDesc
Definition: sced.h:207
#define Not
Definition: cdmacs.h:16
#define PL_PCW
Definition: sced.h:65
void CDGen()
char * mEntry
Definition: sced.h:364
void ShowCommandMenu()
Definition: viewport.c:121
void MallocFailed()
Definition: scedintr.c:857
char * kpCommand
Definition: sced.h:219
long X
Definition: actions.c:450
void ShowMenu()
#define tfree(x)
Definition: cdmacs.h:22
char kpMenu
Definition: sced.h:319
int CDInitGen()
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
#define AMBIGUITYMENU
Definition: sced.h:57
struct o * oRep
Definition: cddefs.h:144
Definition: cddefs.h:142
Definition: cddefs.h:177
MENU AmbiguityMenu[DefMenuSize]
Definition: scedintr.c:51
Definition: cddefs.h:227
void FixMenuPrefix()
#define PL_CMD
Definition: sced.h:64
int IsCellInLib()
#define ESCAPE
Definition: sced.h:91
long Y
Definition: actions.c:450
void ShowPrompt(char *str)
Definition: scedstub.c:71
short oInfo
Definition: cddefs.h:147
static struct o * select_first_call ( )
static

Definition at line 953 of file subckt.c.

955 {
956  struct ks *SQDesc;
957  char *name;
958 
959  for (SQDesc = SelectQHead; SQDesc; SQDesc = SQDesc->ksSucc) {
960  if (SQDesc->ksPointer->oType == CDSYMBOLCALL) {
961  name =
962  ((struct c *)SQDesc->ksPointer->oRep)->cMaster->mName;
963  if (IsCellInLib(name)) continue;
964  return (SQDesc->ksPointer);
965  }
966  }
967  return (NULL);
968 }
struct o * ksPointer
Definition: sced.h:335
char oType
Definition: cddefs.h:148
#define CDSYMBOLCALL
Definition: cddefs.h:43
struct ks * ksSucc
Definition: sced.h:334
#define NULL
Definition: spdefs.h:121
struct o * oRep
Definition: cddefs.h:144
struct ks * SelectQHead
Definition: scedext.h:64
Definition: cddefs.h:177
Definition: sced.h:333
int IsCellInLib()
static void set_subckt_choices ( )
static

Definition at line 305 of file subckt.c.

307 {
308  int i, j;
309  int NumEntries = MenuViewport.kaBottom;
310 
311  for (i = 0; ; i++)
312  if (BasicMenu[i].mEntry == NULL) break;
313  if (i < MenuViewport.kaY)
314  i = MenuViewport.kaY;
315  if (i >= DefMenuSize)
316  i = DefMenuSize - 1;
317  NumEntries = i;
318 
319  for (i = 0; i < NumEntries; i++)
320  if (DeviceMenu[i].mEntry == NULL) break;
321 
322  for (j = 0; (i < NumEntries) && SubCktList[j]; i++, j++) {
323  DeviceMenu[i].mEntry = SubCktList[j];
324  DeviceMenu[i].mActive = False;
325  }
326 
327  DeviceMenu[i].mEntry = NULL;
328  /*
329  FixMenuPrefix(DeviceMenu);
330  */
331 }
long kaY
Definition: sced.h:113
short mActive
Definition: sced.h:365
long kaBottom
Definition: sced.h:112
static char * SubCktList[80]
Definition: subckt.c:33
char * mEntry
Definition: sced.h:364
struct ka MenuViewport
Definition: init.c:18
#define NULL
Definition: spdefs.h:121
#define DefMenuSize
Definition: scedext.h:555
MENU * DeviceMenu
Definition: scedintr.c:50
MENU * BasicMenu
Definition: scedintr.c:49
#define False
Definition: scedstub.c:15
static void set_subckt_list ( )
static

Definition at line 267 of file subckt.c.

269 {
270  struct m *MDesc;
271  int i;
272  int restart = False;
273 
274  if (Parameters.kpCellDesc == NULL)
275  return;
276 
277 top:
278  for (MDesc = Parameters.kpCellDesc->sMasterList; MDesc;
279  MDesc = MDesc->mSucc) {
280 
281  if (IsCellInLib(MDesc->mName))
282  continue;
283 
284  for (i = 0; i < 80 && SubCktList[i]; i++)
285  if (!strcmp(SubCktList[i],MDesc->mName))
286  break;
287 
288  if (i == 80) {
289  if (restart)
290  return;
291  for (i = 0; i < 80; i++) {
292  free(SubCktList[i]);
293  SubCktList[i] = NULL;
294  }
295  restart = True;
296  goto top;
297  }
298  if (SubCktList[i] == NULL)
299  SubCktList[i] = CopyString(MDesc->mName);
300  }
301 }
char * CopyString()
struct s * kpCellDesc
Definition: sced.h:207
static char * SubCktList[80]
Definition: subckt.c:33
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
#define True
Definition: scedstub.c:16
char * mName
Definition: cddefs.h:111
struct m * sMasterList
Definition: cddefs.h:132
struct m * mSucc
Definition: cddefs.h:112
#define False
Definition: scedstub.c:15
int IsCellInLib()
Definition: cddefs.h:109
void free()
void ShowNewInstance ( long  X,
long  Y,
long  RefX,
long  RefY 
)

Definition at line 212 of file subckt.c.

215 {
216  struct ka BB, BB1;
217  long TFold[9];
218  long XX,YY;
219  long DX,DY;
220  int NumX,NumY,Int1,Int2;
221 
222  TCurrent(TFold);
223  NumX = Parameters.kpNumX;
224  NumY = Parameters.kpNumY;
225  DX = Parameters.kpDX;
226  DY = Parameters.kpDY;
227  CDBB(CurInstance.Desc,(struct o *)NULL,&BB.kaLeft,
228  &BB.kaBottom,&BB.kaRight,&BB.kaTop);
229  /* Find translation so cell is always placed with lower left corner
230  * at reference point or use the subckt's nodal reference point if
231  * defined. */
232  XX = BB.kaLeft;
233  YY = BB.kaBottom;
234  (void)get_reference_terminal(CurInstance.Desc,&XX,&YY);
235 
236  TPush();
237  TIdentity();
238  SetNewTransform(XX,YY,X,Y);
239  TPremultiply();
240 
241  for (Int1 = NumY-1; Int1 >= 0; --Int1) {
242  for (Int2 = 0; Int2 < NumX; ++Int2 ){
243  TPush();
244  TIdentity();
245  TTranslate(Int2*DX,Int1*DY);
246  TPremultiply();
247  BB1.kaLeft = BB.kaLeft;
248  BB1.kaRight = BB.kaRight;
249  BB1.kaBottom = BB.kaBottom;
250  BB1.kaTop = BB.kaTop;
251  TPoint(&BB1.kaLeft,&BB1.kaBottom);
252  TPoint(&BB1.kaRight,&BB1.kaTop);
253  if (CurInstance.DevLib)
254  ShowTransformed(CurInstance.Desc,&BB1,TFold);
255  else {
256  TLoadCurrent(TFold);
258  }
259  TPop();
260  }
261  }
262  TPop();
263 }
void TPoint()
int DevLib
Definition: subckt.c:37
void TCurrent()
static struct rd CurInstance
Definition: subckt.c:40
Definition: sced.h:111
void TTranslate()
double kpDY
Definition: sced.h:228
void SetNewTransform()
long X
Definition: actions.c:450
#define NULL
Definition: spdefs.h:121
struct kp Parameters
Definition: init.c:19
void ShowEmptyBox()
void TPremultiply()
Definition: xforms.c:216
int kpNumY
Definition: sced.h:226
Definition: cddefs.h:142
void TLoadCurrent()
int kpNumX
Definition: sced.h:225
void TIdentity()
Definition: xforms.c:189
double kpDX
Definition: sced.h:227
int CDBB()
struct s * Desc
Definition: subckt.c:36
void TPop()
Definition: xforms.c:64
static int get_reference_terminal()
long Y
Definition: actions.c:450
void TPush()
Definition: xforms.c:53
#define HighlightingColor
Definition: sced.h:74
void ShowTransformed()
void UpdateParent ( char *  NewName)

Definition at line 770 of file subckt.c.

773 {
774  char *TypeIn,*MasterName,Type;
775  int NumX,NumY;
776  long X,Y,DX,DY;
777  struct s *CellDesc;
778  struct o *Pointer;
779  struct t *TGen;
780 
781  if (Context == NULL)
782  return;
783 
784  ShowPrompt("Update parent cell to call new cell name? (n) ");
785  TypeIn = FBEdit(NULL);
786  if (TypeIn And (*TypeIn == 'y' Or *TypeIn == 'Y')) {
787  /*Change the instance pushed from so its master is NewName.*/
788  if (Not CDOpen(Context->ccMaster,&CellDesc,'w')) {
789  sprintf(TypeOut,"Can't display %s. MORE",
790  Context->ccMaster);
792  (void)FBGetchar(ERASE);
794  return;
795  }
796  CDCall(Context->ccInst,&MasterName,&NumX,&DX,&NumY,&DY);
797  if (Not CDBeginMakeCall(
798  CellDesc,NewName,NumX,DX,NumY,DY,&Pointer)) {
799  if (CDStatusInt ==
801  sprintf(TypeOut,"Can't write cell %s. MORE",NewName);
803  (void)FBGetchar(ERASE);
805  return;
806  }
808  MallocFailed();
809  }
810  CDInitTGen(Context->ccInst,&TGen);
811  loop {
812  CDTGen(&TGen,&Type,&X,&Y);
813  if (TGen == NULL)
814  break;
815  if (Not CDT(Pointer,Type,X,Y))
816  MallocFailed();
817  }
818  if (Not CDEndMakeCall(CellDesc,Pointer))
819  MallocFailed();
820  CDDelete(CellDesc,Context->ccInst);
821  WroteCell = True;
822  Context->ccModified = True;
824  }
825 }
#define loop
Definition: cdmacs.h:11
int struct o * Pointer
Definition: cd.c:1311
#define Or
Definition: cdmacs.h:15
void CDCall()
Definition: cddefs.h:119
#define ERASE
Definition: scedmacs.h:11
#define Not
Definition: cdmacs.h:16
int CDStatusInt
Definition: cd.c:75
#define CDDelete
Definition: cddefs.h:19
char * ccMaster
Definition: subckt.c:23
#define CDPARSEFAILED
Definition: cddefs.h:27
int CDOpen()
int CDEndMakeCall()
static struct cc * Context
Definition: subckt.c:28
int CDT()
void MallocFailed()
Definition: scedintr.c:857
long X
Definition: actions.c:450
int ccModified
Definition: subckt.c:20
#define NULL
Definition: spdefs.h:121
char TypeOut[200]
Definition: init.c:23
#define elif
Definition: cdmacs.h:10
#define True
Definition: scedstub.c:16
short FBGetchar()
#define CDMALLOCFAILED
Definition: cddefs.h:35
Definition: cddefs.h:142
#define CDNEWSYMBOL
Definition: cddefs.h:29
char * CDStatusString
Definition: cd.c:77
#define And
Definition: cdmacs.h:14
char * FBEdit()
int char Type
Definition: actions.c:449
int CDBeginMakeCall()
Definition: cddefs.h:192
long Y
Definition: actions.c:450
void ShowPrompt(char *str)
Definition: scedstub.c:71
void CDTGen()
static int WroteCell
Definition: subckt.c:32
void CDInitTGen()
struct o * ccInst
Definition: subckt.c:22

Variable Documentation

struct cc* Context
static

Definition at line 28 of file subckt.c.

struct rd CurInstance
static

Definition at line 40 of file subckt.c.

char* MenuNEWSC

Definition at line 92 of file scedintr.c.

char* MenuPLACE

Definition at line 94 of file scedintr.c.

char* MenuUNDO

Definition at line 108 of file scedintr.c.

char* SubCktList[80]
static

Definition at line 33 of file subckt.c.

int WroteCell
static

Definition at line 32 of file subckt.c.