<> <> <> <> <<>> DIRECTORY CD, CDDebug, CDIO, Commander, Convert, DABasics, Rope, Route, RoutePrivate; RouteTest12: CEDAR PROGRAM IMPORTS CD, CDDebug, CDIO, Commander, Convert, Rope, Route = BEGIN EnumerateChannelNets: Route.EnumerateChannelNetsProc ~ { <> nets: LIST OF NetDef _ NARROW[channelData]; UNTIL nets = NIL DO net: NetDef _ nets.first; eachNet[net.name, EnumerateChannelPins, net.exitLeftOrBottom, net.exitRightOrTop, net.mayExit, net.trunkSize*8, NIL, net.netData]; nets _ nets.rest; ENDLOOP}; EnumerateChannelPins: Route.EnumerateChannelPinsProc ~ { <> pins: LIST OF Route.Pin _ NARROW[netData]; UNTIL pins = NIL DO pin: Route.Pin _ pins.first; bottomOrLeft: BOOL _ pin.side = bottom; offset: INT _ IF runType = shiftRight AND bottomOrLeft THEN +11*4 ELSE IF runType = shiftLeft AND bottomOrLeft THEN -11*4 ELSE 0; eachPin[bottomOrLeft, pin.min*8 +offset, pin.max*8+offset, pin.depth, pin.layer]; pins _ pins.rest; ENDLOOP}; BrokenNet: Route.BrokenNetProc ~ { <<[channelData, netData: REF, sourceNet: Label, regionNumber, numberOfRegions: NAT] RETURNS [newLabel: Label]>> newLabel _ Rope.Cat[sourceNet, "-", Convert.RopeFromInt[regionNumber], "/", Convert.RopeFromInt[numberOfRegions]]}; MakeDDENets: PROC [] RETURNS [nets: LIST OF NetDef] ~ { <<>> Net5: PROC [ ] RETURNS [net5: NetDef] ~ { net5p1: Route.Pin _ NEW[Route.PinRec _ [118, 121, 0, metal, top]]; net5p6: Route.Pin _ NEW[Route.PinRec _ [52, 55, 0, metal, bottom]]; net5 _ NEW[NetDefRec _ ["net5", FALSE, FALSE, FALSE, 0, LIST[net5p1, net5p6]]]}; <<>> Net8: PROC [ ] RETURNS [net8: NetDef] ~ { net8p1: Route.Pin _ NEW[Route.PinRec _ [41, 44, 0, metal, top]]; net8p6: Route.Pin _ NEW[Route.PinRec _ [162, 165, 0, metal, bottom]]; net8 _ NEW[NetDefRec _ ["net8", FALSE, FALSE, FALSE, 0, LIST[net8p1, net8p6]]]}; Net14: PROC [ ] RETURNS [net14: NetDef] ~ { net14p1: Route.Pin _ NEW[Route.PinRec _ [162, 165, 0, metal, top]]; net14p4: Route.Pin _ NEW[Route.PinRec _ [118, 121, 0, metal, bottom]]; net14 _ NEW[NetDefRec _ ["net14", FALSE, FALSE, FALSE, 0, LIST[net14p1, net14p4]]]}; NetA: PROC [ ] RETURNS [netA: NetDef] ~ { netAp1: Route.Pin _ NEW[Route.PinRec _ [85, 88, 0, metal, top]]; netAp2: Route.Pin _ NEW[Route.PinRec _ [69, 72, 0, metal, bottom]]; netA _ NEW[NetDefRec _ ["netA", FALSE, FALSE, FALSE, 0, LIST[netAp1, netAp2]]]}; nets _ LIST[Net5[], Net8[], Net14[], NetA[]]; }; RunType: TYPE = {base, shiftLeft, shiftRight}; runType: RunType _ shiftRight; NetDef: TYPE = REF NetDefRec; NetDefRec: TYPE = RECORD [ name: Rope.ROPE, exitLeftOrBottom, exitRightOrTop: BOOL _ FALSE, mayExit: BOOL _ TRUE, trunkSize: CD.Number _ 0, netData: LIST OF Route.Pin _ NIL]; name: Rope.ROPE _ "RouteTest12"; technology: CD.Technology _ CD.FetchTechnology[$cmosB]; metal: CD.Layer _ CD.FetchLayer[technology, $met]; metal2: CD.Layer _ CD.FetchLayer[technology, $met2]; rules: Route.DesignRulesParameters _ Route.DefaultDesignRulesParameters[technology, metal2, metal, horizontal]; Route12: Commander.CommandProc ~{ nets: LIST OF NetDef _ MakeDDENets[]; object: CD.Object _ Route.Channel[EnumerateChannelNets, -12, 2022*8+76, rules, name, BrokenNet, NIL, nets].object; design: CD.Design _ CDDebug.Draw[object, technology].dummyDesign; design.mutability _ editable; [ ] _ CDIO.WriteDesign[design, name]; }; Commander.Register["Route12", Route12]; END.