DIRECTORY BitOps, CoreCreate, CrossRAMDataBuffer, CrossRAMSSI, CrossRAMTop, IO, Rope; CrossRAMTopImpl: CEDAR PROGRAM IMPORTS BitOps, CoreCreate, CrossRAMDataBuffer, CrossRAMSSI, IO, Rope EXPORTS CrossRAMTop = BEGIN OPEN CoreCreate, CrossRAMTop; CreateTop: PUBLIC PROC [design: Design, addressBits, addressDecoderBits, columnOcts, select, log2Select: NAT] RETURNS [cell: CellType] = { name: ROPE _ "CrossRAMTop"; IF (cell _ FetchCell[design, name])=NIL THEN { decoderLeft, decoderDriver, decoderLogicDriver, dataBuffer, dataBufferRight: CellInstance; cell _ CreateRecordCell[design: design, name: name]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["Vdd", "Gnd", "WriteB", "nWriteB", "ReadB", "nReadB"]]; [] _ CreatePublicWire[design: design, on: cell, name: "AddressB", type: CreateWireSequenceType[design: design, count: addressBits]]; [] _ CreatePublicWire[design: design, on: cell, name: "DataB", type: CreateWireSequenceType[design: design, count: columnOcts]]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["AdrBit", "nAdrBit"], type: CreateWireSequenceType[design: design, count: addressDecoderBits]]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["Bit", "nBit"], type: CreateWireSequenceType[design: design, count: select*columnOcts]]; [] _ CreateWire[design: design, in: cell, name: "Select", type: CreateWireSequenceType[design: design, count: select]]; decoderLeft _ CreateCellInstance[design: design, in: cell, type: CreateDecoderDriverLeft[design: design, log2Select: log2Select], bind: IO.PutFR["AddressB: AddressB[0..%g)", IO.int[log2Select]]]; decoderDriver _ CreateCellInstance[design: design, in: cell, type: CreateDecoderDriverSequence[design: design, driverPairCount: (addressBits-log2Select)/2, log2Select: log2Select], bind: IO.PutFR["LowAddressB: AddressB[0..%g), HighAddressB: AddressB[%g..%g)", IO.int[log2Select], IO.int[log2Select], IO.int[addressBits]]]; decoderLogicDriver _ CreateCellInstance[design: design, in: cell, type: CreateDecoderLogicDriver[design: design, select: select, log2Select: log2Select], bind: IO.PutFR["AddressB: AddressB[0..%g), AdrBit: AdrBit[%g], nAdrBit: nAdrBit[%g]", IO.int[log2Select], IO.int[addressDecoderBits-1], IO.int[addressDecoderBits-1]]]; dataBuffer _ CreateCellInstance[design: design, in: cell, type: CrossRAMDataBuffer.CreateDataBuffer[design: design, select: select, columnOcts: columnOcts]]; dataBufferRight _ CreateCellInstance[design: design, in: cell, type: CreateDataBufferRight[design: design]]; PutAttributeOnCell[design: design, on: cell, attribute: [$GenLayout, LIST[ $AbutX, decoderLeft, decoderDriver, decoderLogicDriver, dataBuffer, dataBufferRight]]]; }; }; CreateDecoderDriverLeft: PROC [design: Design, log2Select: NAT] RETURNS [cell: CellType] = { name: ROPE _ "DecoderDriverLeft"; IF (cell _ FetchCell[design, name])=NIL THEN { cell _ CreateRecordCell[design: design, name: name, attribute: [$GenLayout, $Get]]; [] _ CreatePublicWire[design: design, on: cell, name: "Vdd"]; [] _ CreatePublicWire[design: design, on: cell, name: "AddressB", type: CreateWireSequenceType[design: design, count: log2Select]]; }; }; CreateDecoderDriverSequence: PROC [design: Design, driverPairCount, log2Select: NAT] RETURNS [cell: CellType] = { name: ROPE _ "DecoderDriverSequence"; IF (cell _ FetchCell[design, name])=NIL THEN { driverCount: NAT _ 2*driverPairCount; MakeStackRope: PROC [base: ROPE] RETURNS [ROPE] = { RETURN[IO.PutFR["%g: %g[0..%g)", IO.rope[base], IO.rope[base], IO.int[driverCount-2]]]; }; MakePairRope: PROC [base: ROPE] RETURNS [ROPE] = { RETURN[IO.PutFR["%g: %g[%g..%g)", IO.rope[base], IO.rope[base], IO.int[driverCount-2], IO.int[driverCount]]]; }; stack, tree: CellInstance; decoderDriver: CellType _ CreateDecoderDriver[design: design, log2Select: log2Select]; stackDriver: CellType _ CreateSequenceCell[design: design, name: "DecoderDriverStackBitSeq", baseCell: CreateIdentityCell[design: design, name: "DecoderDriverStackBit", baseCell: decoderDriver, attribute: [$GenLayout, LIST[$Inst, decoderDriver, "RemoveForStackDecoderBit"]]], count: driverPairCount-1, sequencePorts: LIST["HighAddressB", "AdrBit", "nAdrBit"], attribute: [$GenLayout, $ArrayX]]; treeDriver: CellType _ CreateIdentityCell[design: design, name: "DecoderDriverTreeBit", baseCell: decoderDriver, attribute: [$GenLayout, LIST[ $Inst, decoderDriver, "RemoveForTreeDecoderBit"]]]; cell _ CreateRecordCell[design: design, name: name]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["Vdd", "Gnd"]]; [] _ CreatePublicWire[design: design, on: cell, name: "LowAddressB", type: CreateWireSequenceType[design: design, count: log2Select]]; [] _ CreatePublicWire[design: design, on: cell, name: "HighAddressB", type: CreateWireSequenceType[design: design, count: driverCount]]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["AdrBit", "nAdrBit"], type: CreateWireSequenceType[design: design, count: driverCount]]; stack _ CreateCellInstance[design: design, in: cell, type: stackDriver, bind: Rope.Cat[MakeStackRope["HighAddressB"], ", ", MakeStackRope["AdrBit"], ", ", MakeStackRope["nAdrBit"]]]; tree _ CreateCellInstance[design: design, in: cell, type: treeDriver, bind: Rope.Cat[MakePairRope["HighAddressB"], ", ", MakePairRope["AdrBit"], ", ", MakePairRope["nAdrBit"]]]; PutAttributeOnCell[design: design, on: cell, attribute: [$GenLayout, LIST[ $AbutX, stack, tree]]]; }; }; CreateDecoderDriver: PROC [design: Design, log2Select: NAT] RETURNS [cell: CellType] = { name: ROPE _ "DecoderDriver"; cell _ CreateSequenceCell[design: design, name: name, baseCell: CreateDecoderDriverHalf[design: design, log2Select: log2Select], count: 2, sequencePorts: LIST["HighAddressB", "AdrBit", "nAdrBit"], attribute: [$GenLayout, $Get]]; }; CreateDecoderDriverHalf: PROC [design: Design, log2Select: NAT] RETURNS [cell: CellType] = { name: ROPE _ "DecoderDriverHalf"; IF (cell _ FetchCell[design, name])=NIL THEN { invert16: CellType _ CrossRAMSSI.CreateInverter[design: design, width: 16]; cell _ CreateRecordCell[design: design, name: name]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["Vdd", "Gnd", "HighAddressB", "AdrBit", "nAdrBit"]]; [] _ CreatePublicWire[design: design, on: cell, name: "LowAddressB", type: CreateWireSequenceType[design: design, count: log2Select]]; [] _ CreateWire[design: design, in: cell, name: "nAddress"]; [] _ CreateCellInstance[design: design, in: cell, type: CrossRAMSSI.CreateInverter[design: design, width: 4], bind: "Input: HighAddressB, Output: nAddress"]; [] _ CreateCellInstance[design: design, in: cell, type: invert16, bind: "Input: nAddress, Output: AdrBit"]; [] _ CreateCellInstance[design: design, in: cell, type: invert16, bind: "Input: HighAddressB, Output: nAdrBit"]; }; }; CreateDecoderLogicDriver: PROC [design: Design, select, log2Select: NAT] RETURNS [cell: CellType] = { name: ROPE _ "DecoderLogicDriver"; IF (cell _ FetchCell[design, name])=NIL THEN { invert8: CellType _ CrossRAMSSI.CreateInverter[design: design, width: 8]; and: CellType _ CrossRAMSSI.CreateAnd[design: design, inputCount: log2Select, width: 16]; cell _ CreateRecordCell[design: design, name: name, attribute: [$GenLayout, $Get]]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["Vdd", "Gnd", "AdrBit", "nAdrBit"]]; [] _ CreatePublicWire[design: design, on: cell, name: "AddressB", type: CreateWireSequenceType[design: design, count: log2Select]]; [] _ CreatePublicWire[design: design, on: cell, name: "Select", type: CreateWireSequenceType[design: design, count: select]]; [] _ CreateWire[design: design, in: cell, name: "nHighAddressB", type: CreateWireSequenceType[design: design, count: log2Select]]; FOR adrBit: NAT IN [0..log2Select) DO [] _ CreateCellInstance[design: design, in: cell, type: invert8, bind: IO.PutFR["Input: AddressB[%g], Output: nHighAddressB[%g]", IO.int[adrBit], IO.int[adrBit]]]; ENDLOOP; FOR select: NAT IN [0..select) DO bind: ROPE _ NIL; FOR adrBit: NAT IN [0..log2Select) DO bind _ Rope.Cat[bind, IF BitOps.EBFW[select, log2Select, adrBit] THEN IO.PutFR["AddressB[%g]", IO.int[adrBit]] ELSE IO.PutFR["nHighAddressB[%g]", IO.int[adrBit]]]; IF adrBit < log2Select-1 THEN bind _ Rope.Cat[bind, ", "]; ENDLOOP; [] _ CreateCellInstance[design: design, in: cell, type: and, bind: IO.PutFR["Input: [%g], Output: Select[%g]", IO.rope[bind], IO.int[select]]]; ENDLOOP; }; }; CreateDataBufferRight: PROC [design: Design] RETURNS [cell: CellType] = { name: ROPE _ "DataBufferRight"; IF (cell _ FetchCell[design, name])=NIL THEN { cell _ CreateRecordCell[design: design, name: name, attribute: [$GenLayout, $Get]]; [] _ CreatePublicWire[design: design, on: cell, names: LIST["Vdd", "WriteB", "nWriteB", "ReadB", "nReadB"]]; }; }; END. †CrossRAMTopImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Barth, September 26, 1985 2:17:26 pm PDT Louis Monier September 20, 1985 6:19:42 pm PDT Ports: Vdd, AddressB[0..log2Select) Ports: Vdd, Gnd, LowAddressB[0..log2Select), HighAddressB[0..2*driverPairCount), AdrBit[0..2*driverPairCount), nAdrBit[0..2*driverPairCount) Ports: Vdd, Gnd, LowAddressB[0..log2Select), HighAddressB[0..2), AdrBit[0..2), nAdrBit[0..2), Ports: Vdd, Gnd, LowAddressB[0..log2Select), HighAddressB, AdrBit, nAdrBit Ports: Vdd, Gnd, AddressB[0..log2Select), AdrBit, nAdrBit, Select[0..select) Ports: Vdd, WriteB, nWriteB, ReadB, nReadB Κ – "cedar" style˜codešœ™Kšœ Οmœ1™