71 #define LARGEBUFFERSIZE 400 126 CDSymbolTable[Int1] =
NULL;
183 char Technology,Mask[];
269 struct m *MasterListDesc;
270 struct s *MasterSymbolDesc;
272 struct prpty PrptyCopy;
278 static int RecursionLevel = 0;
281 printf(
"Begin CDOpen of symbol %s.\n",SymbolName);
284 if (SymbolName ==
NULL Or *SymbolName ==
'\0') {
296 Int2 = strlen(SymbolName);
297 for (Int1 = 0; Int1 < Int2; ++Int1)
298 Key += SymbolName[Int1];
300 while (Bucket !=
NULL) {
307 if (*SymbolDesc !=
NULL) {
332 if (Access !=
'n' And (FDesc =
POpen(SymbolName,
"r",
384 PCIF(SymbolName,&StatusString,&StatusInt);
404 while (MasterListDesc !=
NULL) {
409 CDOpen(MasterListDesc->
mName,&MasterSymbolDesc,
'r');
414 "Master %s doesn't seem to be around.\n",
415 MasterListDesc->
mName);
425 MasterListDesc = MasterListDesc->
mSucc;
430 if (Access ==
'w' Or Access ==
'n') {
497 printf(
"End CDOpen of symbol %s.\n",SymbolName);
519 if (SymbolName ==
NULL)
521 Int2 = strlen(SymbolName);
522 for (Int1 = 0;Int1 < Int2;++Int1)
523 Key += SymbolName[Int1];
525 while (Bucket !=
NULL) {
553 Int2 = strlen(SymbolDesc->sName);
554 for (Int1 = 0; Int1 < Int2; ++Int1)
555 Key += SymbolDesc->sName[Int1];
598 CDGen(SymbolDesc,GenDesc,&Pointer);
611 tfree(SymbolDesc->sHY);
646 struct m *MasterListDesc;
667 printf(
"Begin Reflect(%s).\n",SymbolDesc->sName);
668 printf(
" Old BB is %d %d %d %d.\n",SymbolDesc->sLeft,SymbolDesc->sBottom,
669 SymbolDesc->sRight,SymbolDesc->sTop);
679 printf(
" New BB is %d %d %d %d.\n",SymbolDesc->sLeft,SymbolDesc->sBottom,
680 SymbolDesc->sRight,SymbolDesc->sTop);
684 Bucket = CDSymbolTable[Int1];
702 if (MasterListDesc ==
NULL) {
716 printf(
"Considering %s.\n",MasterListDesc->
mName);
717 printf(
"BB is %d %d %d %d.\n",MasterListDesc->
mLeft,MasterListDesc->
mBottom,
721 if (! strcmp(MasterListDesc->
mName,SymbolDesc->sName)
722 And ((MasterListDesc->
mLeft != SymbolDesc->sLeft
Or 723 MasterListDesc->
mBottom != SymbolDesc->sBottom
Or 724 MasterListDesc->
mRight != SymbolDesc->sRight
Or 725 MasterListDesc->
mTop != SymbolDesc->sTop)
729 printf(
"BB conflict.\n");
732 MasterListDesc->
mLeft = SymbolDesc->sLeft;
733 MasterListDesc->
mBottom = SymbolDesc->sBottom;
734 MasterListDesc->
mRight = SymbolDesc->sRight;
735 MasterListDesc->
mTop = SymbolDesc->sTop;
742 MasterListDesc->
mName))
749 &L,&B,&R,&T))
return (
False);
757 MasterListDesc = MasterListDesc->
mSucc;
766 printf(
"End Reflect(%s).\n",SymbolDesc->sName);
790 struct o *OldPntr,*NewPntr,tmp;
792 struct s *MasterDesc =
NULL;
793 struct prpty *PrptyDesc;
799 long NewL,NewB,NewR,NewT;
802 printf(
"Begin patching instances of master %s for symbol %s.\n",MasterName,SymbolDesc->sName);
805 if (MasterName ==
NULL || *MasterName ==
'\0')
812 CDGen(SymbolDesc,GenDesc,&OldPntr);
815 CDCall(OldPntr,&SymbolName,&NumX,&DX,&NumY,&DY);
816 if (SymbolName ==
NULL)
818 if (strcmp(SymbolName,MasterName) != 0)
824 NumX,DX,NumY,DY,&NewPntr))
829 CDTGen(&TGen,&Type,&X,&Y);
833 if (
Not CDT(NewPntr,Type,X,Y))
864 for (il = Ilst; il; il = il1) {
866 OldPntr = il->pointer;
869 CDCall(OldPntr,&SymbolName,&NumX,&DX,&NumY,&DY);
877 CDTGen(&TGen,&Type,&X,&Y);
881 if (
Not CDT(NewPntr,Type,X,Y))
899 while (PrptyDesc !=
NULL) {
924 printf(
"End patching instances of master %s for symbol %s.\n",MasterName,SymbolDesc->sName);
962 struct
s *SymbolDesc;
964 long Length,Width,X,Y;
967 struct o *ObjectDesc;
968 if (Length == 0
Or Width == 0)
972 Length =
Abs(Length);
976 ObjectDesc->
oInfo = 0;
979 ObjectDesc->
oLeft = X-Length/2;
980 ObjectDesc->
oBottom = Y-Width/2;
981 ObjectDesc->
oRight = X+Length/2;
982 ObjectDesc->
oTop = Y+Width/2;
983 *Pointer = ObjectDesc;
992 struct
s *SymbolDesc;
999 struct la *LabelDesc;
1000 struct o *ObjectDesc;
1007 size = strlen(Label) + 2;
1014 ObjectDesc->
oRep = (
struct o *)LabelDesc;
1016 ObjectDesc->
oInfo = 0;
1022 ObjectDesc->
oRight = X + 400;
1024 ObjectDesc->
oTop = Y + 200;
1030 *Pointer = ObjectDesc;
1039 struct
s *SymbolDesc;
1044 struct po *PolygonDesc;
1045 struct o *ObjectDesc;
1053 PolygonDesc->
poPath = Path;
1054 ObjectDesc->
oRep = (
struct o *)PolygonDesc;
1056 ObjectDesc->
oInfo = 0;
1062 while (Pair !=
NULL) {
1063 if (ObjectDesc->
oLeft > Pair->
pX)
1069 if (ObjectDesc->
oTop < Pair->
pY)
1070 ObjectDesc->
oTop = Pair->
pY;
1073 *Pointer = ObjectDesc;
1082 struct
s *SymbolDesc;
1089 struct o *ObjectDesc;
1097 if (Width < 0) Width = -Width;
1098 WireDesc->
wWidth = Width;
1099 WireDesc->
wPath = Path;
1100 ObjectDesc->
oRep = (
struct o *)WireDesc;
1102 ObjectDesc->
oInfo = 0;
1108 while (Pair !=
NULL) {
1109 if (ObjectDesc->
oLeft > Pair->
pX-Width/2)
1110 ObjectDesc->
oLeft = Pair->
pX-Width/2;
1111 if (ObjectDesc->
oRight < Pair->
pX+Width/2)
1112 ObjectDesc->
oRight = Pair->
pX+Width/2;
1113 if (ObjectDesc->
oBottom > Pair->
pY-Width/2)
1115 if (ObjectDesc->
oTop < Pair->
pY+Width/2)
1116 ObjectDesc->
oTop = Pair->
pY+Width/2;
1119 *Pointer = ObjectDesc;
1128 struct
s *SymbolDesc;
1133 struct r *RoundFlashDesc;
1134 struct o *ObjectDesc;
1140 RoundFlashDesc->
rWidth = Width;
1141 RoundFlashDesc->
rX =
X;
1142 RoundFlashDesc->
rY =
Y;
1143 ObjectDesc->
oRep = (
struct o *)RoundFlashDesc;
1145 ObjectDesc->
oInfo = 0;
1148 ObjectDesc->
oLeft = X-Width/2;
1149 ObjectDesc->
oBottom = Y-Width/2;
1150 ObjectDesc->
oRight = X+Width/2;
1151 ObjectDesc->
oTop = Y+Width/2;
1152 *Pointer = ObjectDesc;
1160 struct
s *SymbolDesc;
1178 struct o *ObjectDesc;
1179 struct m *MasterListDesc;
1180 struct s *MasterSymbolDesc;
1181 struct prpty *PrptyDesc;
1189 CallDesc->
cNumX = NumX;
1191 CallDesc->
cNumY = NumY;
1194 ObjectDesc->
oRep = (
struct o *)CallDesc;
1196 ObjectDesc->
oInfo = 0;
1199 *Pointer = ObjectDesc;
1200 MasterListDesc = SymbolDesc->sMasterList;
1208 if (MasterListDesc ==
NULL) {
1215 size = strlen(SymbolName) + 2;
1219 if (SymbolDesc->sMasterList !=
NULL)
1220 SymbolDesc->sMasterList->mPred = MasterListDesc;
1221 MasterListDesc->
mSucc = SymbolDesc->sMasterList;
1223 SymbolDesc->sMasterList = MasterListDesc;
1231 CDOpen(MasterListDesc->
mName,&MasterSymbolDesc,
'r');
1236 MasterListDesc->
mName);
1237 if (SymbolDesc->sMasterList !=
NULL)
1238 SymbolDesc->sMasterList->mPred =
NULL;
1240 SymbolDesc->sMasterList = MasterListDesc->
mSucc;
1241 tfree(MasterListDesc);
1246 &(MasterListDesc->
mRight),&(MasterListDesc->
mTop)))
1265 MasterListDesc->
mRight = MasterListDesc->
mTop = 0;
1269 elif (strcmp(SymbolName,MasterListDesc->
mName) == 0) {
1283 MasterListDesc = MasterListDesc->
mSucc;
1285 CallDesc->
cMaster = MasterListDesc;
1336 TDesc = TDesc->
tSucc;
1349 struct
s *SymbolDesc;
1353 struct o *ObjectDesc;
1354 struct m *MasterListDesc;
1360 CallDesc = (
struct c *)ObjectDesc->
oRep;
1361 MasterListDesc = CallDesc->
cMaster;
1368 CDTGen(&TGen,&Type,&X,&Y);
1382 printf(
"Making call of master %s in symbol %s.\n",MasterListDesc->
mName,
1384 printf(
"Untransformed (master's) BB is %d %d %d %d.\n",
1386 MasterListDesc->
mRight,MasterListDesc->
mTop);
1393 ObjectDesc->
oTop = MasterListDesc->
mTop;
1401 printf(
"Transformed, unarrayed BB is %d %d %d %d.\n",
1415 printf(
"Transformed, arrayed BB is %d %d %d %d.\n",
1462 struct
s *SymbolDesc;
1463 struct
o *ObjectDesc;
1465 int Int1,Int2,
Layer;
1467 long BeginX,EndX,BeginY,EndY;
1470 ObjectDesc->
oTop,&BeginX,&EndX,&BeginY,&EndY);
1480 Layer = ObjectDesc->
oLayer;
1481 if (SymbolDesc->sBin[Layer] == (
struct o ***)
NULL) {
1483 if ((SymbolDesc->sBin[Layer] = (
struct o ***)
1486 for (Int1 = 0; Int1 <=
CDNUMBINS; ++Int1) {
1487 if ((SymbolDesc->sBin[Layer][Int1] = (
struct o **)
1490 for (Int2 = 0; Int2 <=
CDNUMBINS; ++Int2) {
1491 if ((SymbolDesc->sBin[Layer][Int1][Int2] = (
struct o *)
1494 SymbolDesc->sBin[
Layer][Int1][Int2] = (
struct o *)
NULL;
1498 elif (SymbolDesc->sBin[Layer][X][Y] !=
NULL)
1499 SymbolDesc->sBin[
Layer][
X][
Y]->oPred = ObjectDesc;
1501 SymbolDesc->sBin[
Layer][
X][
Y] = ObjectDesc;
1503 SymbolDesc->sLeft =
Min(SymbolDesc->sLeft,ObjectDesc->
oLeft);
1504 SymbolDesc->sBottom =
Min(SymbolDesc->sBottom,ObjectDesc->
oBottom);
1505 SymbolDesc->sRight =
Max(SymbolDesc->sRight,ObjectDesc->
oRight);
1506 SymbolDesc->sTop =
Max(SymbolDesc->sTop,ObjectDesc->
oTop);
1509 if (X == 0
And Y == 0)
1510 printf(
"Inserting a desc on layer %d in residual bin.\n",Layer);
1512 printf(
"Inserting a desc on layer %d in bin (%d,%d).\n",Layer,X,Y);
1516 if (X == 0
And Y == 0)
1517 printf(
"Inserting a desc on layer %d in residual bin.\n",Layer);
1519 printf(
"Inserting a desc on layer %d in bin (%d,%d).\n",Layer,X,Y);
1550 struct
s *SymbolDesc;
1551 struct
o *ObjectDesc;
1555 long BeginX,EndX,BeginY,EndY;
1560 Layer = ObjectDesc->
oLayer;
1562 if (SymbolDesc->sBin[Layer] ==
NULL Or ObjectDesc ==
NULL)
1565 ObjectDesc->
oTop,&BeginX,&EndX,&BeginY,&EndY);
1573 if (SymbolDesc->sBin[Layer][X][Y] ==
NULL)
1595 SymbolDesc->sBBValid =
False;
1614 CallDesc = (
struct c *)ObjectDesc->
oRep;
1618 TDesc = CallDesc->
cT;
1619 while (TDesc !=
NULL) {
1622 TDesc = TCopy.
tSucc;
1627 struct po *PolygonDesc;
1630 PolygonDesc = (
struct po *)ObjectDesc->
oRep;
1631 Pair = PolygonDesc->
poPath;
1643 WireDesc = (
struct w *)ObjectDesc->
oRep;
1644 Pair = WireDesc->
wPath;
1655 printf(
"Deleting a desc on layer %d in bin (%d,%d)\n.",Layer,X,Y);
1695 struct s *MasterDesc;
1697 if (Pointer ==
NULL)
1707 CallDesc = (
struct c *)Pointer->oRep;
1709 *NumX = CallDesc->
cNumX;
1710 *DX = CallDesc->
cDX;
1711 *NumY = CallDesc->
cNumY;
1712 *DY = CallDesc->
cDY;
1720 long *Length,*Width,*X,*Y;
1723 if (Pointer ==
NULL)
1725 if (Pointer->oType !=
CDBOX)
1726 *Layer = *Length = *Width = *X = *Y = 0;
1728 *Layer = Pointer->oLayer;
1729 *Length = Pointer->oRight - Pointer->oLeft;
1730 *Width = Pointer->oTop - Pointer->oBottom;
1731 *X = Pointer->oLeft + (*Length >> 1);
1732 *Y = Pointer->oBottom + (*Width >> 1);
1745 struct la *LabelDesc;
1747 if (Pointer ==
NULL)
1749 if (Pointer->oType !=
CDLABEL) {
1750 *Layer = *X = *Y = 0;
1755 *Layer = Pointer->oLayer;
1756 LabelDesc = (
struct la *)Pointer->oRep;
1758 *X = LabelDesc->
laX;
1759 *Y = LabelDesc->
laY;
1771 struct po *PolygonDesc;
1773 if (Pointer ==
NULL)
1780 *Layer = Pointer->oLayer;
1781 PolygonDesc = (
struct po *)Pointer->oRep;
1782 *Path = PolygonDesc->
poPath;
1796 if (Pointer ==
NULL)
1798 if (Pointer->oType !=
CDWIRE) {
1799 *Layer = *Width = 0;
1803 *Layer = Pointer->oLayer;
1804 WireDesc = (
struct w *)Pointer->oRep;
1805 *Width = WireDesc->
wWidth;
1806 *Path = WireDesc->
wPath;
1817 struct r *RoundFlashDesc;
1819 if (Pointer ==
NULL)
1823 *Layer = Pointer->oLayer;
1824 RoundFlashDesc = (
struct r *)Pointer->oRep;
1825 *Width = RoundFlashDesc->
rWidth;
1826 *X = RoundFlashDesc->
rX;
1827 *Y = RoundFlashDesc->
rY;
1859 struct
s *SymbolDesc;
1867 if (Pointer ==
NULL)
1868 *Info = SymbolDesc->sInfo;
1870 *Info = Pointer->
oInfo;
1876 struct
s *SymbolDesc;
1884 if (Pointer ==
NULL)
1885 SymbolDesc->sInfo = Info;
1887 Pointer->
oInfo = Info;
1899 *Type = Pointer->
oType;
1905 struct
s *SymbolDesc;
1922 *Left = SymbolDesc->
sLeft;
1923 *Bottom = SymbolDesc->
sBottom;
1924 *Right = SymbolDesc->
sRight;
1925 *Top = SymbolDesc->
sTop;
1928 printf(
"CDBB1(%s,%d,%d,%d,%d)\n",SymbolDesc->
sName,*Left,*Bottom,*Right,*Top);
1932 printf(
"CDBB1(%s,%d,%d,%d,%d)\n",SymbolDesc->
sName,*Left,*Bottom,*Right,*Top);
1938 *Left = Pointer->
oLeft;
1940 *Right = Pointer->
oRight;
1941 *Top = Pointer->
oTop;
1944 printf(
"CDBB2(%s,%d,%d,%d,%d)\n",SymbolDesc->
sName,*Left,*Bottom,*Right,*Top);
1948 printf(
"CDBB2(%s,%d,%d,%d,%d)\n",SymbolDesc->
sName,*Left,*Bottom,*Right,*Top);
1958 CDGen(SymbolDesc,GenDesc,&Pointer);
1959 if (Pointer ==
NULL)
1970 CDGen(SymbolDesc,GenDesc,&Pointer);
1971 if (Pointer ==
NULL)
1978 CDGen(SymbolDesc,GenDesc,&Pointer);
1979 if (Pointer ==
NULL)
1985 SymbolDesc->
sTop = 0;
1987 *Left = SymbolDesc->
sLeft;
1988 *Bottom = SymbolDesc->
sBottom;
1989 *Right = SymbolDesc->
sRight;
1990 *Top = SymbolDesc->
sTop;
1993 printf(
"CDBB3(%s,%d,%d,%d,%d)\n",SymbolDesc->
sName,*Left,*Bottom,*Right,*Top);
1997 printf(
"CDBB3(%s,%d,%d,%d,%d)\n",SymbolDesc->
sName,*Left,*Bottom,*Right,*Top);
2019 long Left,Bottom,Right,Top;
2020 long *BeginX,*EndX,*BeginY,*EndY;
2094 struct
s *SymbolDesc;
2096 long Left,Bottom,Right,Top;
2103 long BeginX,BeginY,EndX,EndY;
2106 printf(
"Begin initializing generator to search symbol %s.\n",SymbolDesc->sName);
2107 printf(
"Untransformed AOI is %ld %ld %ld %ld.\n",Left,Bottom,Right,Top);
2122 printf(
"Transformed AOI is %ld %ld %ld %ld.\n",Left,Bottom,Right,Top);
2125 CDIntersect(Left,Bottom,Right,Top,&BeginX,&EndX,&BeginY,&EndY);
2128 printf(
"Initialized generator to search bins %ld..%ld,%ld..%ld on layer %d.\n",
2129 BeginX,EndX,BeginY,EndY,Layer);
2134 (*GenDesc)->gLeft =
Left;
2135 (*GenDesc)->gBottom =
Bottom;
2136 (*GenDesc)->gRight =
Right;
2137 (*GenDesc)->gTop =
Top;
2138 (*GenDesc)->gLayer =
Layer;
2139 (*GenDesc)->gX = (*GenDesc)->gBeginX = BeginX;
2140 (*GenDesc)->gY = (*GenDesc)->gBeginY = EndY;
2141 (*GenDesc)->gEndX = EndX;
2142 (*GenDesc)->gEndY = BeginY;
2151 if (SymbolDesc->sBin[Layer] ==
NULL)
2152 (*GenDesc)->gPointer =
NULL;
2154 (*GenDesc)->gPointer = SymbolDesc->sBin[Layer][0][0];
2157 printf(
"End initializing generator to search symbol %s.\n",SymbolDesc->sName);
2166 struct
s *SymbolDesc;
2200 printf(
"Generator intersecting %ld %ld %ld %ld to AOI.\n",L,B,R,T);
2212 printf(
"Invisible.\n");
2219 printf(
"Visible.\n");
2231 if (GenDesc->
gY < GenDesc->
gEndY) {
2242 if (SymbolDesc->sBin[i] ==
NULL) {
2248 GenDesc->
gPointer = SymbolDesc->sBin[i][GenDesc->
gX][GenDesc->
gY];
2250 if (GenDesc->
gX > GenDesc->
gEndX) {
2266 if (Pointer ==
NULL)
2270 CallDesc = (
struct c *)Pointer->oRep;
2271 *TGen = CallDesc->
cT;
2281 static FirstDesc =
True;
2289 *Type = (*TGen)->tType;
2292 *TGen = (*TGen)->tSucc;
2293 if (*TGen ==
NULL) {
2299 *Type = (*TGen)->tType;
2332 struct
s *SymbolDesc;
2345 struct prpty *PrptyDesc;
2349 long X,
Y,Length,Width;
2354 if (SymbolFile ==
NULL) {
2355 if ((FileDesc =
POpen(SymbolDesc->sName,
"w",(
char **)
NULL))
2357 fprintf(FileDesc,
"(Symbol %s);\n",SymbolDesc->sName);
2363 if ((FileDesc =
POpen(SymbolFile,
"w",(
char **)
NULL))
2366 s = strrchr(SymbolFile,DIR_TERM);
2369 for (i = 0, s++; *s; i++, s++)
2371 SymbolFile[i] =
'\0';
2373 fprintf(FileDesc,
"(Symbol %s);\n",SymbolFile);
2375 fprintf(FileDesc,
"9 %s;\n",SymbolDesc->sName);
2382 SymbolDesc->sLeft = SymbolDesc->sBottom =
CDINFINITY;
2383 SymbolDesc->sRight = SymbolDesc->sTop = -
CDINFINITY;
2387 CDGen(SymbolDesc,GenDesc,&Pointer);
2388 if (Pointer ==
NULL)
2390 CDCall(Pointer,&SymbolName,&NumX,&DX,&NumY,&DY);
2392 fprintf(FileDesc,
"9 %s;\n",SymbolName);
2399 if (NumX != 1
Or NumY != 1)
2400 fprintf(FileDesc,
"1 Array %d %ld %d %ld;\n",NumX,DX,NumY,DY);
2401 fprintf(FileDesc,
"C 0");
2404 CDTGen(&TGen,&Type,&X,&Y);
2406 fprintf(FileDesc,
";\n");
2410 fprintf(FileDesc,
" R %ld %ld",X,Y);
2412 fprintf(FileDesc,
" T %ld %ld",X,Y);
2414 fprintf(FileDesc,
" MX");
2416 fprintf(FileDesc,
" MY");
2418 SymbolDesc->sLeft =
Min(SymbolDesc->sLeft,Pointer->
oLeft);
2419 SymbolDesc->sBottom =
Min(SymbolDesc->sBottom,Pointer->
oBottom);
2420 SymbolDesc->sRight =
Max(SymbolDesc->sRight,Pointer->
oRight);
2421 SymbolDesc->sTop =
Max(SymbolDesc->sTop,Pointer->
oTop);
2427 CDGen(SymbolDesc,GenDesc,&Pointer);
2428 if (Pointer ==
NULL)
2437 CDWire(Pointer,&Layer,&Width,&Path);
2445 CDLabel(Pointer,&Layer,&Label,&X,&Y,&Xform);
2446 fprintf(FileDesc,
"94 %s %ld %ld %d",Label,X,Y,Xform);
2447 fprintf(FileDesc,
";\n");
2450 CDBox(Pointer,&Layer,&Length,&Width,&X,&Y);
2451 GenBox(FileDesc,Length,Width,X,Y,1,0);
2453 SymbolDesc->sLeft =
Min(SymbolDesc->sLeft,Pointer->
oLeft);
2454 SymbolDesc->sBottom =
Min(SymbolDesc->sBottom,Pointer->
oBottom);
2455 SymbolDesc->sRight =
Max(SymbolDesc->sRight,Pointer->
oRight);
2456 SymbolDesc->sTop =
Max(SymbolDesc->sTop,Pointer->
oTop);
2457 CDGen(SymbolDesc,GenDesc,&Pointer);
2458 if (Pointer ==
NULL)
2463 SymbolDesc->sLeft = SymbolDesc->sBottom = SymbolDesc->sRight =
2464 SymbolDesc->sTop = 0;
2476 struct
s *SymbolDesc;
2483 struct s *MasterDesc;
2484 struct p *Pair,*Path;
2486 struct prpty *PrptyDesc;
2490 long X,
Y,Length,Width;
2513 CDGen(SymbolDesc,GenDesc,&Pointer);
2514 if (Pointer ==
NULL)
2516 CDCall(Pointer,&SymbolName,&NumX,&DX,&NumY,&DY);
2517 if (
Not CDOpen(SymbolName,&MasterDesc,
'w'))
2522 if (
Not CDGenCIF(FileDesc,MasterDesc,SymbolNum,A,B,Program))
2530 if (Program ==
'e') {
2535 fprintf(FileDesc,
"DS %d 1 1;\n",Info);
2537 if (Program ==
'b' Or Program ==
'a')
2538 fprintf(FileDesc,
"( %s );\n",SymbolDesc->
sName);
2539 elif (Program ==
'i')
2540 fprintf(FileDesc,
"( 9 %s );\n",SymbolDesc->
sName);
2541 elif (Program ==
's')
2542 fprintf(FileDesc,
"( Name: %s );\n",SymbolDesc->
sName);
2544 fprintf(FileDesc,
"9 %s;\n",SymbolDesc->
sName);
2548 CDGen(SymbolDesc,GenDesc,&Pointer);
2549 if (Pointer ==
NULL)
2551 CDCall(Pointer,&SymbolName,&NumX,&DX,&NumY,&DY);
2552 if (
Not CDOpen(SymbolName,&MasterDesc,
'w'))
2555 if (
Not CDBB(MasterDesc,(
struct o *)
NULL,&Left,&Bottom,&Right,&Top))
2557 for (i = 1;i <= NumY;++i) {
2558 for (j = 1;j <= NumX;++j) {
2560 if (Program ==
'e') {
2564 fprintf(FileDesc,
"C %d",Info);
2568 CDTGen(&TGen,&Type,&X,&Y);
2570 fprintf(FileDesc,
";\n");
2574 fprintf(FileDesc,
" R %ld %ld",X,Y);
2576 fprintf(FileDesc,
" T %ld %ld",
2577 (X+(j-1)*DX)*A/B,(Y+(i-1)*DY)*A/B);
2581 fprintf(FileDesc,
" T %ld %ld",X*A/B,Y*A/B);
2583 fprintf(FileDesc,
" MX");
2585 fprintf(FileDesc,
" MY");
2591 if (
CDLayer[Layer-1].lCDFrom) {
2593 fprintf(FileDesc,
"L %d;\n",Layer);
2600 OutputLayer =
False;
2605 CDGen(SymbolDesc,GenDesc,&Pointer);
2606 if (Pointer ==
NULL)
2609 if (Program ==
'e') {
2614 if (!OutputLayer && Type !=
CDLABEL) {
2618 CDBox(Pointer,&Layer,&Length,&Width,&X,&Y);
2619 GenBox(FileDesc,Length*A/B,Width*A/B,X*A/B,Y*A/B,1,0);
2622 CDWire(Pointer,&Layer,&Width,&Path);
2624 fprintf(FileDesc,
"W %d %d %d",Width*A/B,
2625 Path->
pX*A/B,Path->
pY*A/B);
2627 fprintf(FileDesc,
"W %d",Width*A/B);
2629 while (Pair !=
NULL) {
2630 fprintf(FileDesc,
" %ld %ld",Pair->
pX*A/B,Pair->
pY*A/B);
2634 fprintf(FileDesc,
";\n");
2638 fprintf(FileDesc,
"P");
2640 while (Pair !=
NULL) {
2641 fprintf(FileDesc,
" %ld %ld",Pair->
pX*A/B,Pair->
pY*A/B);
2644 fprintf(FileDesc,
";\n");
2647 CDLabel(Pointer,&Layer,&Label,&X,&Y,&Xform);
2648 if (Program ==
'k' Or Program ==
'e')
2649 fprintf(FileDesc,
"94 %s %ld %ld %d;\n",
2650 Label,X*A/B,Y*A/B,(
char)Xform);
2651 elif (Program ==
'b')
2652 fprintf(FileDesc,
"94 %s %ld %ld %d;\n",
2653 Label,X*A/B,Y*A/B,Layer);
2654 elif (Program ==
'm') {
2655 fprintf(FileDesc,
"94 %s %ld %ld",Label,X*A/B,Y*A/B);
2656 if (
CDLayer[Layer].lTechnology !=
' ') {
2657 fprintf(FileDesc,
" %c",
CDLayer[Layer].lTechnology);
2659 while (i < 3 And
CDLayer[Layer].lMask[i] > 040) {
2660 fprintf(FileDesc,
"%c",
CDLayer[Layer].lMask[i]);
2664 fprintf(FileDesc,
";\n");
2676 char *CIFFile,*Root;
2702 PCIF(CIFFile,&StatusString,&StatusInt);
2728 PCIF(CIFFile,&StatusString,&StatusInt);
2745 CDFrom(Root,CIFFile,A,B,Layers,NumLayers,Program)
2746 char *Root,*CIFFile,Program;
2748 int Layers[],NumLayers;
2760 for (Layer = 0;Layer < NumLayers;++
Layer)
2765 if ((FileDesc =
POpen(CIFFile,
"w",(
char **)
NULL)) ==
NULL) {
2778 fprintf(FileDesc,
"(CIF file of symbol hierarchy rooted at %s);\n",Root);
2779 if (
Not CDGenCIF(FileDesc,SymbolDesc,&SymbolNum,A,B,Program))
2782 fprintf(FileDesc,
"C %d;\nE\n",Info);
2794 char *Root,*CIFFile,Program;
2800 struct m *MasterListDesc1;
2801 struct m *MasterListDesc2;
2802 struct s *MasterSymbolDesc1;
2803 struct s *MasterSymbolDesc2;
2829 PCIF(CIFFile,&StatusString,&StatusInt);
2840 PCIF(CIFFile,&StatusString,&StatusInt);
2847 while (MasterListDesc1 !=
NULL) {
2848 CDOpen(MasterListDesc1->
mName,&MasterSymbolDesc1,
'r');
2853 MasterListDesc1->
mName);
2858 while (MasterListDesc2 !=
NULL) {
2859 CDOpen(MasterListDesc2->
mName,&MasterSymbolDesc2,
'r');
2864 "Master %s doesn't seem to be around.\n",
2865 MasterListDesc2->
mName);
2873 MasterListDesc2 = MasterListDesc2->
mSucc;
2879 MasterListDesc1 = MasterListDesc1->
mSucc;
2891 struct
s *SymbolDesc;
2900 struct s *MasterDesc;
2904 #ifdef DEBUG_CDUNMARK 2905 fprintf(stderr,
"\n\n");
2906 fprintf(stderr,
"1CDUnmark: Inititialezed generator on instance layer.\n\n");
2909 CDGen(SymbolDesc,GenDesc,&Pointer);
2910 if (Pointer ==
NULL)
2913 #ifdef DEBUG_CDUNMARK 2914 fprintf(stderr,
"2CDUnmark: CDGen found instance: Pointer = 0x%x\n\n",Pointer);
2917 CDCall(Pointer,&SymbolName,&NumX,&DX,&NumY,&DY);
2919 #ifdef DEBUG_CDUNMARK 2920 fprintf(stderr,
"3CDUnmark: instance name = %s\n\n",SymbolName);
2927 if (
Not CDOpen(SymbolName,&MasterDesc,
'r'))
2930 #ifdef DEBUG_CDUNMARK 2931 fprintf(stderr,
"4CDUnmark: CDOpen returned MasterDesc = 0x%x\n\n",MasterDesc);
2947 #ifdef DEBUG_CDUNMARK 2948 fprintf(stderr,
"5CDUnmark: Inititialezed generator on layer %d.\n\n",Layer);
2952 CDGen(SymbolDesc,GenDesc,&Pointer);
2953 if (Pointer ==
NULL)
2956 #ifdef DEBUG_CDUNMARK 2957 fprintf(stderr,
"6CDUnmark: CDGen found instance: Pointer = 0x%x\n\n",Pointer);
struct prpty * sPrptyList
void CDLabel(struct o *Pointer, int *Layer, char **Label, long *X, long *Y, char *Xform)
int CDMakeLabel(struct s *SymbolDesc, int Layer, char *Label, long X, long Y, char Xform, struct o **Pointer)
void CDWire(struct o *Pointer, int *Layer, long *Width, struct p **Path)
int CDFrom(char *Root, char *CIFFile, long A, long B, Layers, NumLayers, char Program)
void CDPolygon(struct o *Pointer, int *Layer, struct p **Path)
void CDInitTGen(struct o *Pointer, struct t **TGen)
void CDDeleteObjectDesc(struct s *SymbolDesc, struct o *ObjectDesc)
#define Max(Dragon, Eagle)
#define Min(Dragon, Eagle)
static char CDDiagnosticString[LARGEBUFFERSIZE]
struct l CDLayer[CDNUMLAYERS+1]
int CDParseCIF(char *Root, char *CIFFile, char Program)
int CDReflect(struct s *SymbolDesc)
int CDInitGen(struct s *SymbolDesc, int Layer, long Left, long Bottom, long Right, long Top, struct g **GenDesc)
int CDGenCIF(FILE *FileDesc, struct s *SymbolDesc, int *SymbolNum, long A, long B, char Program)
struct bu * CDSymbolTable[CDNUMLAYERS+1]
void CDInfo(struct s *SymbolDesc, struct o *Pointer, int *Info)
int CDTo(char *CIFFile, char *Root, long A, long B, char Program)
char(* dSymTabNames)[FILENAMESIZE]
int CDBeginMakeCall(struct s *SymbolDesc, char *SymbolName, int NumX, long DX, int NumY, long DY, struct o **Pointer)
int struct s * SymbolDesc
int CDMakeWire(struct s *SymbolDesc, int Layer, long Width, struct p *Path, struct o **Pointer)
void CDIntersect(long Left, long Bottom, long Right, long Top, long *BeginX, long *EndX, long *BeginY, long *EndY)
int CDClose(struct s *SymbolDesc)
void CDSetLayer(int Layer, char Technology, Mask)
void CDCheckPath(struct p *Path)
int CDMakePolygon(struct s *SymbolDesc, int Layer, struct p *Path, struct o **Pointer)
void CDSymbol(char *SymbolName, struct s **SymbolDesc)
void CDRoundFlash(struct o *Pointer, int *Layer, long *Width, long *X, long *Y)
while(TDesc->tSucc!=NULL)
char dSymbolName[FILENAMESIZE]
struct prpty * prpty_Succ
void CDTGen(struct t **TGen, char *Type, long *X, long *Y)
int CDMakeRoundFlash(struct s *SymbolDesc, int Layer, long Width, long X, long Y, struct o **Pointer)
int CDUnmark(struct s *SymbolDesc)
void char ** StatusString
void CDSetInfo(struct s *SymbolDesc, struct o *Pointer, int Info)
int CDInsertObjectDesc(struct s *SymbolDesc, struct o *ObjectDesc)
void CDBox(struct o *Pointer, int *Layer, long *Length, long *Width, long *X, long *Y)
int CDMakeBox(struct s *SymbolDesc, int Layer, long Length, long Width, long X, long Y, struct o **Pointer)
void CDGen(struct s *SymbolDesc, struct g *GenDesc, struct o **Pointer)
void CDType(struct o *Pointer, char *Type)
struct prpty * oPrptyList
struct o *** sBin[CDNUMLAYERS+1]
int CDOpen(char *SymbolName, struct s **SymbolDesc, char Access)
int CDPatchInstances(struct s *SymbolDesc, char *MasterName)
struct prpty * dPrptyList
int CDUpdate(struct s *SymbolDesc, char *SymbolFile)
void CDCall(struct o *Pointer, char **SymbolName, int *NumX, long *DX, int *NumY, long *DY)
#define SwapInts(Dragon, Eagle)