<> <> <> <<>> DIRECTORY CD, Core, CoreFrame, CoreLibrary, CoreName, CoreWire, CoreXform, IFUCoreCells, IFUCoreData, CoreInstCell, Rope; IFUCoreDataGPRowImpl: CEDAR PROGRAM IMPORTS CoreFrame, CoreLibrary, CoreName, CoreWire, CoreXform, IFUCoreCells, IFUCoreData, CoreInstCell, Rope = BEGIN ROPE: TYPE = Core.ROPE; <<>> Signal: SIGNAL = CODE; ExpandDataGPRowFrame: CoreFrame.ExpandProc = { -- frameCT specificBit: Core.CellType; nil: ROPE _ CoreName.RopeNm["nil"]; data: IFUCoreData.DpCellData _ NARROW[frameCT.data]; out0: CoreWire.CWire _ CoreWire.CWire[frameCT.public].f["out"].i[0]; frame: REF CoreFrame.FrameRec _ NEW[CoreFrame.FrameRec _ [first: left]]; domain: INT _ CoreXform.XformSize[CoreXform.GetXform[out0]]; frame.seq _ NEW[CoreFrame.FrameSeq[domain*2]]; FOR ii: INT DECREASING IN [0..domain) DO cwire: CoreWire.CWire _ [frameCT.public]; renameProc: CoreInstCell.RenameProc = {new _ TranslateGenericName[cwire, ii, old]}; in0: ROPE _ cwire.f["in"].i[0].x[ii].n; in1: ROPE _ cwire.f["in"].i[1].x[ii].n; gName: ROPE _ data.type.x[ii].n; genCell: Core.CellType _ IF out0.x[ii].n[]#nil THEN IFUCoreData.ConstantInputVariant[ gName, in0, in1 ] ELSE CoreLibrary.Get[IFUCoreCells.library, gName.Cat["Blank"]]; IF genCell=NIL THEN Signal[]; specificBit _ CoreInstCell.SpecificGeneric[genCell, renameProc]; frame.seq[ii*2+0] _ IFUCoreData.DpBitRoute[specificBit, genCell, cwire, ii, data.channels]; frame.seq[ii*2+1] _ CoreFrame.NewFrameCell[0, NIL, [first: left, cell: specificBit]]; ENDLOOP; frameCT.class _ CoreFrame.frameCellClass; frameCT.data _ frame; frame.cell _ CoreFrame.RecastFrameHard[frameCT]; IFUCoreData.BlockSides[frame.cell, [frameCT.public]]; frame.seq _ NEW[CoreFrame.FrameSeq[0]]; -- free the children <> CoreFrame.SetFrameExpandProc[soft, frameCT, NIL]; CoreFrame.SetFrameExpandProc[hard, frameCT, NIL] }; VDD: ROPE _ CoreName.RopeNm["VDD"]; GND: ROPE _ CoreName.RopeNm["GND"]; inRp: ROPE _ CoreName.RopeNm["in"]; outRp: ROPE _ CoreName.RopeNm["out"]; ctl: ROPE _ CoreName.RopeNm[""]; TranslateGenericName: PROC[cwire: CoreWire.CWire, ii: INT, pinName: ROPE] RETURNS[name: ROPE_NIL] = { sig: CoreName.SigRec _ CoreName.NameSig[pinName]; digit: INT _ IF sig.cy#-1 THEN sig.cy ELSE 0; SELECT sig.root FROM NIL => RETURN[cwire.f[ "in" ].i[ digit ].x[ii].n]; inRp => RETURN[cwire.f[ "in" ].i[ digit ].x[ii].n]; outRp => RETURN[cwire.f[ "out" ].i[ digit ].x[ii].n]; GND => RETURN[cwire.f[ "pwr" ].i[ 0 ].x[ii].n]; VDD => RETURN[cwire.f[ "pwr" ].i[ 1 ].x[ii].n]; ctl => { IF name = NIL THEN name _ cwire.f[ "left" ].i[ digit ].x[ii].n; IF name = NIL THEN name _ cwire.f[ "right" ].i[ digit ].x[ii].n; IF name=NIL THEN Signal[]; RETURN[name]}; ENDCASE => Signal[]; RETURN[name]}; IFUCoreData.RegisterSubClassExpand [hard, "GPRow", ExpandDataGPRowFrame]; IFUCoreData.RegisterSubClassExpand [soft, "GPRow", ExpandDataGPRowFrame]; END.