DIRECTORY CD, CDBasics, CDCells, CMosB, Core, CoreClasses, CoreGeometry, CoreOps, CoreProperties, Sinix, SinixImpl, StructureColor; SinixAmorph: CEDAR PROGRAM IMPORTS CDBasics, CDCells, CMosB, CoreClasses, CoreGeometry, CoreOps, CoreProperties, Sinix, SinixImpl SHARES SinixImpl = BEGIN ExtractAmorphTransistor: PUBLIC Sinix.ExtractProc = { result _ SinixImpl.SearchObjectCache[obj, mode, userData]; IF result=NIL THEN { EachInstance: CDCells.InstEnumerator = { IF NOT ISTYPE[inst.ob.specific, CD.RectSpecific] THEN ERROR; SELECT inst.ob.layer FROM CMosB.pol, CMosB.pwell => { IF gateFound THEN ERROR; gateFound _ TRUE; gateLayout _ [inst.ob, inst.trans]; }; CMosB.pwellCont => { IF islandFound THEN ERROR; islandFound _ TRUE; islandLayout _ [inst.ob, inst.trans]; }; CMosB.ndif => { IF ch1Found THEN { IF ch2Found THEN ERROR; ch2Found _ TRUE; ch2Layout _ [inst.ob, inst.trans]; } ELSE { ch1Found _ TRUE; ch1Layout _ [inst.ob, inst.trans]; }; }; ENDCASE => ERROR; }; Decorate: PROC [port: CoreClasses.TransistorPort, instance: CoreGeometry.Instance] = { wire: Core.Wire = cellType.public[ORD [port]]; CoreGeometry.PutPins[mode.decoration, wire, LIST[instance]]; CoreGeometry.PutGeometry[mode.decoration, wire, LIST[instance]]; }; cellType: Core.CellType; gateFound, ch1Found, ch2Found, islandFound: BOOL _ FALSE; gateLayout, ch1Layout, ch2Layout, islandLayout: CoreGeometry.Instance; mappedCh1, mappedCh2: CD.Rect; length, width: INT _ 0; [] _ CDCells.EnumerateInstances[obj, EachInstance]; mappedCh1 _ CDBasics.MapRect[ch1Layout.obj.bbox, ch1Layout.trans]; mappedCh2 _ CDBasics.MapRect[ch2Layout.obj.bbox, ch2Layout.trans]; IF mappedCh1.y1 # mappedCh2.y1 OR mappedCh1.y2 # mappedCh2.y2 THEN ERROR; IF mappedCh1.x2 > mappedCh2.x1 THEN { tRect: CD.Rect _ mappedCh2; tInstance: CoreGeometry.Instance _ ch2Layout; mappedCh2 _ mappedCh1; mappedCh1 _ tRect; ch2Layout _ ch1Layout; ch1Layout _ tInstance; }; length _ (mappedCh2.x1 - mappedCh1.x2)/CMosB.lambda; width _ (mappedCh2.y2 - mappedCh2.y1)/CMosB.lambda; cellType _ CoreClasses.CreateTransistor[ type: nE, length: length, width: width, props: CoreProperties.Props[[CoreOps.nameProp, Sinix.NameFromSatellites[obj, properties]], [$SinixAmorphType, IF gateLayout.obj.layer=CMosB.pol THEN $LowVoltage ELSE $HighVoltage]]]; Decorate[gate, gateLayout]; Decorate[ch1, ch1Layout]; Decorate[ch2, ch2Layout]; CoreGeometry.PutObject[mode.decoration, cellType, obj]; result _ cellType; SinixImpl.AddInCache[obj, mode, userData, result]; }; }; ExtractAmorphResistor: PUBLIC Sinix.ExtractProc = { result _ SinixImpl.SearchObjectCache[obj, mode, userData]; IF result=NIL THEN { EachInstance: CDCells.InstEnumerator = { IF NOT ISTYPE[inst.ob.specific, CD.RectSpecific] THEN ERROR; SELECT inst.ob.layer FROM CMosB.bur => { IF gateFound THEN ERROR; gateFound _ TRUE; gateLayout _ [inst.ob, inst.trans]; }; CMosB.ndif => { IF ch1Found THEN { IF ch2Found THEN ERROR; ch2Found _ TRUE; ch2Layout _ [inst.ob, inst.trans]; } ELSE { ch1Found _ TRUE; ch1Layout _ [inst.ob, inst.trans]; }; }; ENDCASE => ERROR; }; Decorate: PROC [port: INT, instance: CoreGeometry.Instance] = { wire: Core.Wire = cellType.public[port]; CoreGeometry.PutPins[mode.decoration, wire, LIST[instance]]; CoreGeometry.PutGeometry[mode.decoration, wire, LIST[instance]]; }; cellType: Core.CellType; gateFound, ch1Found, ch2Found: BOOL _ FALSE; gateLayout, ch1Layout, ch2Layout: CoreGeometry.Instance; mappedCh1, mappedCh2: CD.Rect; length, width: INT _ 0; [] _ CDCells.EnumerateInstances[obj, EachInstance]; mappedCh1 _ CDBasics.MapRect[ch1Layout.obj.bbox, ch1Layout.trans]; mappedCh2 _ CDBasics.MapRect[ch2Layout.obj.bbox, ch2Layout.trans]; IF mappedCh1.y1 # mappedCh2.y1 OR mappedCh1.y2 # mappedCh2.y2 THEN ERROR; IF mappedCh1.x2 > mappedCh2.x1 THEN { tRect: CD.Rect _ mappedCh2; tInstance: CoreGeometry.Instance _ ch2Layout; mappedCh2 _ mappedCh1; mappedCh1 _ tRect; ch2Layout _ ch1Layout; ch1Layout _ tInstance; }; length _ (mappedCh2.x1 - mappedCh1.x2)/CMosB.lambda; width _ (mappedCh2.y2 - mappedCh2.y1)/CMosB.lambda; cellType _ CoreClasses.CreateUnspecified[ public: CoreOps.CreateWire[LIST[CoreOps.CreateWire[name: "r1"], CoreOps.CreateWire[name: "r2"]]], props: CoreProperties.Props[[CoreOps.nameProp, Sinix.NameFromSatellites[obj, properties]], [$ResistorLength, NEW[INT _ length]], [$ResistorWidth, NEW[INT _ width]]]]; Decorate[0, ch1Layout]; Decorate[1, ch2Layout]; CoreProperties.PutCellTypeProp[cellType, $CoreStructureColorer, resistorColorer]; -- hack, eliminates load dependency on StructuralComparison CoreGeometry.PutObject[mode.decoration, cellType, obj]; result _ cellType; SinixImpl.AddInCache[obj, mode, userData, result]; }; }; ExtractPolyResistor: PUBLIC Sinix.ExtractProc = { result _ SinixImpl.SearchObjectCache[obj, mode, userData]; IF result=NIL THEN { EachInstance: CDCells.InstEnumerator = { IF NOT ISTYPE[inst.ob.specific, CD.RectSpecific] THEN ERROR; SELECT inst.ob.layer FROM CMosB.bur => { IF gateFound THEN ERROR; gateFound _ TRUE; gateLayout _ [inst.ob, inst.trans]; }; CMosB.ndif => { SELECT FALSE FROM ch1Found => {ch1Found _ TRUE; ch1Layout _ [inst.ob, inst.trans]}; ch2Found => {ch2Found _ TRUE; ch2Layout _ [inst.ob, inst.trans]}; ch3Found => {ch3Found _ TRUE; ch3Layout _ [inst.ob, inst.trans]}; ENDCASE => ERROR; }; ENDCASE => ERROR; }; Decorate: PROC [port: INT, instance: CoreGeometry.Instance] = { wire: Core.Wire = cellType.public[port]; CoreGeometry.PutPins[mode.decoration, wire, LIST[instance]]; CoreGeometry.PutGeometry[mode.decoration, wire, LIST[instance]]; }; cellType: Core.CellType; gateFound, ch1Found, ch2Found, ch3Found: BOOL _ FALSE; gateLayout, ch1Layout, ch2Layout, ch3Layout: CoreGeometry.Instance; mappedCh1, mappedCh2, mappedCh3: CD.Rect; leftC, midC, rightC: CoreGeometry.Instance; leftMC, midMC, rightMC: CD.Rect; length, width: INT _ 0; [] _ CDCells.EnumerateInstances[obj, EachInstance]; mappedCh1 _ CDBasics.MapRect[ch1Layout.obj.bbox, ch1Layout.trans]; mappedCh2 _ CDBasics.MapRect[ch2Layout.obj.bbox, ch2Layout.trans]; mappedCh3 _ CDBasics.MapRect[ch3Layout.obj.bbox, ch3Layout.trans]; IF mappedCh1.y1 # mappedCh2.y1 OR mappedCh2.y1 # mappedCh3.y1 OR mappedCh1.y2 # mappedCh2.y2 OR mappedCh2.y2 # mappedCh3.y2 THEN ERROR; SELECT TRUE FROM mappedCh1.x2 = mappedCh2.x1 AND mappedCh2.x2 = mappedCh3.x1 => { leftC _ ch1Layout; midC _ ch2Layout; rightC _ ch3Layout; leftMC _ mappedCh1; midMC _ mappedCh2; rightMC _ mappedCh3 }; mappedCh1.x2 = mappedCh3.x1 AND mappedCh3.x2 = mappedCh2.x1 => { leftC _ ch1Layout; midC _ ch3Layout; rightC _ ch2Layout; leftMC _ mappedCh1; midMC _ mappedCh3; rightMC _ mappedCh2 }; mappedCh2.x2 = mappedCh1.x1 AND mappedCh1.x2 = mappedCh3.x1 => { leftC _ ch2Layout; midC _ ch1Layout; rightC _ ch3Layout; leftMC _ mappedCh2; midMC _ mappedCh1; rightMC _ mappedCh3 }; mappedCh2.x2 = mappedCh3.x1 AND mappedCh3.x2 = mappedCh1.x1 => { leftC _ ch2Layout; midC _ ch3Layout; rightC _ ch1Layout; leftMC _ mappedCh2; midMC _ mappedCh3; rightMC _ mappedCh1 }; mappedCh3.x2 = mappedCh1.x1 AND mappedCh1.x2 = mappedCh2.x1 => { leftC _ ch3Layout; midC _ ch1Layout; rightC _ ch2Layout; leftMC _ mappedCh3; midMC _ mappedCh1; rightMC _ mappedCh2 }; mappedCh3.x2 = mappedCh2.x1 AND mappedCh2.x2 = mappedCh2.x1 => { leftC _ ch3Layout; midC _ ch2Layout; rightC _ ch1Layout; leftMC _ mappedCh3; midMC _ mappedCh2; rightMC _ mappedCh1 }; ENDCASE => ERROR; --rectangles do not abut ch1Layout _ leftC; ch2Layout _ midC; ch3Layout _ rightC; mappedCh1 _ leftMC; mappedCh2 _ midMC; mappedCh3 _ rightMC; length _ (mappedCh2.x2 - mappedCh2.x1)/CMosB.lambda; width _ (mappedCh2.y2 - mappedCh2.y1)/CMosB.lambda; cellType _ CoreClasses.CreateUnspecified[ public: CoreOps.CreateWire[LIST[CoreOps.CreateWire[name: "r1"], CoreOps.CreateWire[name: "r2"]]], props: CoreProperties.Props[[CoreOps.nameProp, Sinix.NameFromSatellites[obj, properties]], [$ResistorLength, NEW[INT _ length]], [$ResistorWidth, NEW[INT _ width]]]]; Decorate[0, ch1Layout]; Decorate[1, ch3Layout]; CoreProperties.PutCellTypeProp[cellType, $CoreStructureColorer, resistorColorer]; -- hack, eliminates load dependency on StructuralComparison CoreGeometry.PutObject[mode.decoration, cellType, obj]; result _ cellType; SinixImpl.AddInCache[obj, mode, userData, result]; }; }; resistorColorer: StructureColor.Colorer _ NEW[StructureColor.ColorerPrivate _ [ CellTypeColor: ResistorColor, ColorPorts: ResistorPortColor]]; ResistorColor: PROC [ct: Core.CellType] RETURNS [StructureColor.Color] = { RETURN[LOOPHOLE[resistorColorer]]; }; ResistorPortColor: PROC [ct: Core.CellType, SetColor: PROC [Core.Wire, StructureColor.Color]] = { IF ct.public.size#2 THEN ERROR; IF ct.public[0].size#0 THEN ERROR; SetColor[ct.public[0], 1]; IF ct.public[1].size#0 THEN ERROR; SetColor[ct.public[1], 1]; }; Sinix.RegisterExtractProc[$ExtractAmorphTransistor, ExtractAmorphTransistor]; Sinix.RegisterExtractProc[$ExtractAmorphResistor, ExtractAmorphResistor]; Sinix.RegisterExtractProc[$ExtractPolyResistor, ExtractPolyResistor]; END.  SinixAmorph.mesa Barth, July 25, 1989 2:44:42 pm PDT Last Edited by: Gasbarro June 23, 1989 5:32:06 pm PDT CoreProperties.PutCellTypeProp[cellType, StructureColor.ColorerProp, resistorColorer]; CoreProperties.PutCellTypeProp[cellType, StructureColor.ColorerProp, resistorColorer]; Κσ– "cedar" style˜codešœ™Kšœ#™#K™5—K™KšΟk œœw˜ƒK˜•StartOfExpansion[]šΠbn œœ˜Kšœ_˜fKšœ ˜Kšœ˜—J˜šΟnœœ˜5Jšœ:˜:šœœœ˜šŸ œ˜(Jš œœœœœœ˜<šœ˜šœ˜Jšœ œœ˜Jšœ œ˜Jšœ#˜#J˜—šœ˜Jšœ œœ˜Jšœœ˜Jšœ%˜%J˜—šœ˜šœ œ˜Jšœ œœ˜Jšœ œ˜Jšœ"˜"Jšœ˜—šœ˜Jšœ œ˜Jšœ"˜"J˜—J˜—Jšœœ˜—J˜—šŸœœH˜VJšœ"œ ˜.Jšœ,œ ˜