<> <> <> <> <> DIRECTORY RoseTypes, Inverter, RoseCreate, RoseConvert, SwitchTypes; InverterImpl: CEDAR PROGRAM IMPORTS RoseCreate, RoseConvert EXPORTS Inverter = BEGIN OPEN RoseTypes, Inverter; <> RegisterCells: PROC = BEGIN Inverter _ RoseCreate.RegisterCellType[name: "Inverter", expandProc: InverterExpand, ioCreator: CreateInverterIO, driveCreator: CreateInverterDrive, evals: [], tests: LIST[[name: "InverterTest", proc: InverterTestInverterTest, stateToo: FALSE]], ports: CreateInverterPorts[] ]; END; otherss: SymbolTable _ RoseCreate.GetOtherss["Inverter.partsAssertions"]; Inverter: PUBLIC CellType; CreateInverterPorts: PROC RETURNS [ports: Ports] = {ports _ RoseCreate.PortsFromFile["Inverter.Inverter.rosePorts"]}; InverterSwitchIORef: TYPE = REF InverterSwitchIORec; InverterSwitchIORec: TYPE = RECORD [ Vdd: SwitchTypes.SwitchVal ,Gnd: SwitchTypes.SwitchVal ,In: SwitchTypes.SwitchVal ,Out: SwitchTypes.SwitchVal ]; InverterSimpleIORef: TYPE = REF InverterSimpleIORec; InverterSimpleIORec: TYPE = RECORD [ fill0: [0 .. 32767], Vdd: BOOLEAN ,fill1: [0 .. 32767], Gnd: BOOLEAN ,fill2: [0 .. 32767], In: BOOLEAN ,fill3: [0 .. 32767], Out: BOOLEAN ]; InverterDriveRef: TYPE = REF InverterDriveRec; InverterDriveRec: TYPE = RECORD [driveRecordInitialPadding: DriveTagType, drive: PACKED ARRAY InverterPort OF DriveLevel]; InverterPort: TYPE = { Vdd, Gnd, In, Out}; CreateInverterIO: PROC [ct: CellType, switch: BOOL] RETURNS [ioAsAny: REF ANY] --IOCreator-- = { ioAsAny _ IF switch THEN NEW[InverterSwitchIORec] ELSE NEW[InverterSimpleIORec]; }; CreateInverterDrive: PROC [ct: CellType] RETURNS [driveAsAny: REF ANY] --DriveCreator-- = { driveAsAny _ NEW[InverterDriveRec]; }; InverterExpand: PROC [thisCell: Cell, to: ExpansionReceiver] --ExpandProc-- = { PrivateLookupNode: PROC [name: ROPE] RETURNS [node: Node] = {node _ RoseCreate.LookupNode[from: thisCell, path: LIST[name]]}; Vdd: Node _ PrivateLookupNode["Vdd"]; Gnd: Node _ PrivateLookupNode["Gnd"]; In: Node _ PrivateLookupNode["In"]; Out: Node _ PrivateLookupNode["Out"]; others: SymbolTable _ RoseCreate.GetOthers[otherss, "Inverter"]; <> [] _ RoseConvert.Instantiate[thisCell: thisCell, to: to]; }; InverterTestInverterTest: CellTestProc = BEGIN simpleInstr: InverterSimpleIORef _ NARROW[simpleInstructions]; drive: InverterDriveRef _ NARROW[driveAsAny]; BEGIN OPEN drive, simpleInstr; END; END; RegisterCells[]; END.