30 #define Mtest(zap) if((zap) == 0) MallocFailed() 84 ShowPrompt(
"No device library found, and no subcircuits!");
99 if (TypeIn ==
NULL || *TypeIn ==
'\0') {
110 ShowPrompt(
"Bad subcell name, not found or error.");
115 if (!strcmp(SubCktList[i],TypeIn))
break;
116 if (i < 80 && SubCktList[i] ==
NULL)
134 struct s *MasterDesc;
143 while (*TypeIn) TypeIn++;
149 ShowPrompt(
"Bad subcell name, not found or error.");
155 ShowPrompt(
"Point to locations to place cell.");
166 *LookedAhead =
False;
220 int NumX,NumY,Int1,Int2;
241 for (Int1 = NumY-1; Int1 >= 0; --Int1) {
242 for (Int2 = 0; Int2 < NumX; ++Int2 ){
279 MDesc = MDesc->
mSucc) {
285 if (!strcmp(SubCktList[i],MDesc->
mName))
291 for (i = 0; i < 80; i++) {
293 SubCktList[i] =
NULL;
298 if (SubCktList[i] ==
NULL)
319 for (i = 0; i < NumEntries; i++)
322 for (j = 0; (i < NumEntries) &&
SubCktList[j]; i++, j++) {
354 R-L+(
long)DX*
RESOLUTION,NumY,T-B+(
long)DY*RESOLUTION,&Pointer)) {
364 if (XX != 0 || YY != 0)
403 PDesc = CellDesc->sPrptyList;
436 long X,
Y,DX,DY,Width,Length;
442 ShowPrompt(
"Objects must be selected first.");
453 sprintf(
TypeOut,
"Can't create symbol %s.",TypeIn);
462 fprintf(FileDesc,
"(Symbol %s);\n",TypeIn);
463 fprintf(FileDesc,
"9 %s;\n",TypeIn);
470 fprintf(FileDesc,
"5 %d %d %d %d %d %g;\n",
485 CDCall(Pointer,&SymbolName,&NumX,&DX,&NumY,&DY);
487 fprintf(FileDesc,
"9 %s;\n",SymbolName);
495 fprintf(FileDesc,
"5 %d %d %d %ld %ld;\n",
501 fprintf(FileDesc,
"5 %d %d %d %d %d %g;\n",
509 fprintf(FileDesc,
"5 %d %ld %ld %d %d;\n",
517 fprintf(FileDesc,
"5 %d %s %d %s;\n",
522 fprintf(FileDesc,
"5 %d %s %d;\n",
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");
541 CDTGen(&TGen,&Type,&X,&Y);
543 fprintf(FileDesc,
";\n");
547 fprintf(FileDesc,
" R %ld %ld",X,Y);
549 fprintf(FileDesc,
" T %ld %ld",X-Xo,Y-Yo);
551 fprintf(FileDesc,
" MX");
553 fprintf(FileDesc,
" MY");
564 CDWire(Pointer,&Layer,&Width,&Path);
565 fprintf(FileDesc,
"5 %d -1 0 0 0;\n",
P_NODE);
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");
585 sprintf(
TypeOut,
"New symbol %s created and saved.",TypeIn);
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;
614 if (p1 ==
NULL)
break;
616 name = ((
struct c *)p1->
oRep)->cMaster->mName;
617 if (!
cieq(name,
"ind"))
continue;
628 if (p2 ==
NULL)
break;
630 name = ((
struct c *)p2->
oRep)->cMaster->mName;
631 if (!
cieq(name,
"ind"))
continue;
637 found1 = found2 =
False;
646 if (found1 && found2)
676 if (Pointer !=
NULL)
break;
691 CDCall(Pointer,&MasterName,&NumX,&DX,&NumY,&DY);
741 ShowPrompt(
"Building database. Please wait.");
774 char *TypeIn,*MasterName,
Type;
784 ShowPrompt(
"Update parent cell to call new cell name? (n) ");
786 if (TypeIn
And (*TypeIn ==
'y' Or *TypeIn ==
'Y')) {
789 sprintf(
TypeOut,
"Can't display %s. MORE",
796 CDCall(Context->
ccInst,&MasterName,&NumX,&DX,&NumY,&DY);
798 CellDesc,NewName,NumX,DX,NumY,DY,&Pointer)) {
801 sprintf(
TypeOut,
"Can't write cell %s. MORE",NewName);
812 CDTGen(&TGen,&Type,&X,&Y);
815 if (
Not CDT(Pointer,Type,X,Y))
839 ShowPrompt(
"There isn't a context to pop to.");
852 ShowPrompt(
"You've modified this cell. Do you want to save it (y)?");
856 if (TypeIn[0] !=
'n' && TypeIn[0] !=
'N')
899 Context = Context->
ccNext;
916 sprintf(
TypeOut,
"Circuit %s has been modified. Save it? (y) ",
921 if (*TypeIn !=
'n' && *TypeIn !=
'N') {
988 if (Pointer ==
NULL)
break;
991 name = ((
struct c *)Pointer->
oRep)->cMaster->mName;
1010 ShowPrompt(
"Point to the name of the subcircuit you want selected.");
1019 ShowPrompt(
"You aren't pointing at the menu.");
1034 if (Pointer ==
NULL)
break;
1037 name = ((
struct c *)Pointer->
oRep)->cMaster->mName;
1054 struct s *MasterDesc;
1056 struct ks *OldSQDesc;
1057 struct prpty *PDesc;
1067 struct ka OldSelectQBB;
1073 ShowPrompt(
"You haven't selected a subcircuit to flatten.");
1082 for (; SQDesc !=
NULL; SQDesc = SQDesc->
ksSucc) {
1089 if (
OpenCell(MasterName,&MasterDesc))
continue;
1094 for (Int1 = NumY; Int1 >= 1; --Int1) {
1095 for (Int2 = 1; Int2 <= NumX; ++Int2) {
1112 OldSelectQBB.
kaLeft -= 600;
1113 OldSelectQBB.
kaTop += 600;
1125 if (Undo ==
False) {
1158 struct s *MasterDesc;
1159 struct prpty *PDesc, *PDesc1;
1173 PDesc = CellDesc->sPrptyList;
1192 CDGen(CellDesc,GenDesc,&Pointer);
1193 if (Pointer ==
NULL)
break;
1196 CDCall(Pointer,&MasterName,&NumX,&DX,&NumY,&DY);
1198 if (
TFull())
return;
1200 if (
OpenCell(MasterName,&MasterDesc))
return;
1212 for (Int1 = NumY; Int1 >= 1; Int1--) {
1213 for (Int2 = 1; Int2 <= NumX; Int2++) {
1251 CDGen(CellDesc,GenDesc,&Pointer);
1252 if (Pointer ==
NULL)
break;
1256 CDLabel(Pointer,&Layer,&Label,&X,&Y,&Xform);
1265 CDWire(Pointer,&Layer,&Width,&Path);
1282 struct
s **MasterDesc;
1286 if (
Not CDOpen(Master,MasterDesc,
'r')) {
1288 sprintf(
TypeOut,
"Can't display circuit %s. MORE",Master);
1299 "Can't display circuit %s, because it doesn't seem to be around.",
struct kw * kpWindowStack
struct prpty * sPrptyList
static struct o * select_first_call()
int OpenCell(char *Master, struct s **MasterDesc)
struct ka * kvCoarseWindow
static struct o * make_array()
void AddResultingTransform()
static void set_subckt_list()
int MutSelected(struct prpty *PDesc)
static char * SubCktList[80]
void Push(int *LookedAhead)
static struct rd CurInstance
void EraseLargeCoarseViewport()
void UpdateParent(char *NewName)
static void set_subckt_choices()
static struct cc * Context
union prp_data * prpty_Data
static void flatten_cell()
static struct o * select_call()
void Flatten(int *LookedAhead)
void ShowNewInstance(long X, long Y, long RefX, long RefY)
struct prp_branch p_branch
struct prpty * prpty_Succ
void AssignWireProperties()
void FBSetRubberBanding()
MENU AmbiguityMenu[DefMenuSize]
static int get_reference_terminal()
void ShowPrompt(char *str)
struct prpty * oPrptyList
void Place(int *LookedAhead)
#define HighlightingColor