<> <> <> <> <> <<>> <> <<>> DIRECTORY CD, Core, CoreDirectory, CoreGeometry, CoreOps, CoreProperties, LogicUtils, PWCore, RefTab, Rope, SymTab; StdCellsCmosB: CEDAR PROGRAM IMPORTS CoreDirectory, CoreGeometry, CoreOps, CoreProperties, LogicUtils, PWCore, RefTab, Rope, SymTab ~ BEGIN <> GetMask: PROC [cellType: Core.CellType] RETURNS [mask: Core.CellType] = { mask _ LogicUtils.LibraryGet[ NARROW [CoreProperties.GetCellTypeProp[cellType, $Library]], Rope.Cat[CoreOps.GetCellTypeName[cellType], ".mask"] ]; }; LayoutLibrary: PWCore.LayoutProc = { obj _ CoreGeometry.GetObject[PWCore.extractMode.decoration, GetMask[cellType]]; }; DecorateLibrary: PWCore.DecorateProc = { extractedCT: Core.CellType _ GetMask[cellType]; extractedToSource: RefTab.Ref _ RefTab.Create[extractedCT.public.size]; FindInExtractedPublic: CoreOps.EachWireProc = { FOR names: LIST OF Rope.ROPE _ CoreOps.GetFullWireNames[cellType.public, wire], names.rest WHILE names#NIL DO name: Rope.ROPE _ names.first; extractedWire: Core.Wire _ CoreOps.FindWire[extractedCT.public, name]; previousSourceWire: Core.Wire _ NARROW [RefTab.Fetch[extractedToSource, extractedWire].val]; IF extractedWire=NIL OR extractedWire.size#0 THEN LOOP; IF previousSourceWire#NIL AND previousSourceWire#wire THEN SIGNAL PWCore.PinsCorrespondingToSeveralPublics[cellType, obj, LIST [previousSourceWire, wire], CoreGeometry.GetPins[PWCore.extractMode.decoration, extractedWire]]; IF NOT CoreGeometry.HasPins[PWCore.extractMode.decoration, extractedWire] THEN SIGNAL PWCore.NoPinsOnAtomicPublic[cellType, obj, extractedWire, name]; CoreGeometry.AddIndirectLazyPins[PWCore.extractMode.decoration, wire, extractedWire]; [] _ RefTab.Store[extractedToSource, extractedWire, wire]; ENDLOOP; }; [] _ CoreOps.VisitWire[cellType.public, FindInExtractedPublic]; }; <> library: CoreDirectory.Library _ SymTab.Create[]; <> schLibrary: Rope.ROPE = "SCLibCMOSBSch"; maskLibrary: Rope.ROPE = "SCLibCMOSBMask"; MakeSCCell: PROC [name, schName: Rope.ROPE] ~ { sch: Core.CellType _ LogicUtils.LibraryGet[schLibrary, schName]; PWCore.SetLayout[sch, $GetLibrary, $Library, maskLibrary]; [] _ CoreDirectory.Insert[library, name, sch]; }; [] _ PWCore.RegisterLayoutAtom[$GetLibrary, LayoutLibrary, DecorateLibrary]; <> MakeSCCell["feedthru", "feedthru.sch"]; <> MakeSCCell["gnd", "gnd.sch"]; MakeSCCell["vdd", "vdd.sch"]; MakeSCCell["inv", "inv.sch"]; MakeSCCell["invBuffer", "invBuffer.sch"]; MakeSCCell["tstDriver", "tstDriver.sch"]; MakeSCCell["rec2V", "rec2V.sch"]; MakeSCCell["recTTL", "recTTL.sch"]; MakeSCCell["and2", "and2.sch"]; MakeSCCell["and3", "and3.sch"]; MakeSCCell["and4", "and4.sch"]; MakeSCCell["nand2", "nand2.sch"]; MakeSCCell["nand3", "nand3.sch"]; MakeSCCell["nand4", "nand4.sch"]; MakeSCCell["or2", "or2.sch"]; MakeSCCell["or3", "or3.sch"]; MakeSCCell["or4", "or4.sch"]; MakeSCCell["nor2", "nor2.sch"]; MakeSCCell["nor3", "nor3.sch"]; MakeSCCell["nor4", "nor4.sch"]; MakeSCCell["xor2", "xor2.sch"]; MakeSCCell["xnor2", "xnor2.sch"]; MakeSCCell["a22o2i", "a22o2i.sch"]; MakeSCCell["o22a2i", "o22a2i.sch"]; MakeSCCell["a21o2i", "a21o2i.sch"]; MakeSCCell["o21a2i", "o21a2i.sch"]; MakeSCCell["pd", "pd.sch"]; MakeSCCell["pu", "pu.sch"]; MakeSCCell["pdw", "pdw.sch"]; MakeSCCell["puw", "puw.sch"]; <> MakeSCCell["ff", "ff.sch"]; MakeSCCell["ffEn", "ffEn.sch"]; MakeSCCell["dLatch", "dLatch.sch"]; <> [] _ CoreDirectory.RegisterLibrary[library, "CMOSB"]; END.