DIRECTORY CD, CDBasics, Convert, PW, PWRoute, Rope, RouteUtil; PWRouteTest: CEDAR PROGRAM IMPORTS CD, CDBasics, Convert, PW, PWRoute, Rope, RouteUtil = BEGIN ROPE: TYPE = Rope.ROPE; IRSize: PROC [obj: PW.Object] RETURNS [size: CD.Position] = {size _ CDBasics.SizeOfRect[CD.InterestRect[obj]]}; TestChRouterX: PW.UserProc = BEGIN routerParams: PWRoute.RouterParams _ NEW[PWRoute.RouterParamsRec _ ["metal2", "metal", design.technology.key]]; leftOrig: PW.Object _ PW.Get[design, "ChXleft"]; leftXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, leftOrig, right, 50, "metal"]; left: PW.Object _ PW.AbutX[leftOrig, leftXfer]; rightOrig: PW.Object _ PW.Get[design, "ChXright"]; rightXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, rightOrig, left, 50, "metal"]; right: PW.Object _ PW.AbutX[rightXfer, rightOrig]; topOrig: PW.Object _ PW.Get[design, "ChXtop"]; topXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, topOrig, bottom, 50, "metal2"]; top: PW.Object _ PW.AbutY[topXfer, topOrig]; bottomOrig: PW.Object _ PW.Get[design, "ChXbottom"]; bottomXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, bottomOrig, top, 50, "metal2"]; bottom: PW.Object _ PW.AbutY[bottomOrig, bottomXfer]; test: PW.Object _ PWRoute.AbutChRouteListX[LIST[left, right], LIST[bottom], LIST[top], routerParams]; RETURN[test]; END; TestChRouterY: PW.UserProc = BEGIN left, right, top, bottom, test: PW.Object; left _ PW.Get[design, "ChYleft"]; right _ PW.Get[design, "ChYright"]; top _ PW.Get[design, "ChYtop"]; bottom _ PW.Get[design, "ChYbottom"]; test _ PWRoute.AbutChRouteListY[LIST[bottom, top], LIST[left], LIST[right]]; RETURN[test]; END; TestSbRouterH: PW.UserProc = BEGIN left, right, top, bottom, sb, column, test: PW.Object; dx1, dx2, dy1: INT; left _ PW.Get[design, "SbXleft"]; right _ PW.Get[design, "SbXright"]; top _ PW.Get[design, "SbXtop"]; bottom _ PW.Get[design, "SbXbottom"]; sb _ PWRoute.AbutSbRoute[bottom, right, top, left, horizontal]; column _ PW.AbutListY[LIST[bottom, sb, top]]; test _ PW.CreateEmptyCell[]; dy1 _ IRSize[bottom].y; dx1 _ IRSize[left].x; dx2 _ IRSize[column].x; [] _ PW.IncludeInCell[test, left, [0, dy1]]; [] _ PW.IncludeInCell[test, column, [dx1 , 0]]; [] _ PW.IncludeInCell[test, right, [dx1 + dx2, dy1]]; PW.RepositionCell[test]; RETURN[test]; END; TestSbSmlRouterH: PW.UserProc = BEGIN left: PW.Object _ PW.Get[design, "SbXSmlLeft"]; right: PW.Object _ PW.Get[design, "SbXSmlRight"]; top: PW.Object _ PW.Get[design, "SbXSmlTop"]; bottom: PW.Object _ PW.Get[design, "SbXSmlBottom"]; h: INT _ MAX[IRSize[bottom].x, IRSize[top].x]; v: INT _ MAX[IRSize[left].y, IRSize[right].y]; dy1: INT _ IRSize[bottom].y; dx1: INT _ IRSize[left].x; rect: PWRoute.RefRect _ NEW[PWRoute.Rect _ [-dx1, -dy1, h + dx1, v + dy1]]; sb: PW.Object _ PWRoute.MakeChannel[bottom, top, left, right, rect, PWRoute.defaultRouterParams, FALSE, switchBox]; dx2: INT _ IRSize[sb].x; dy2: INT _ IRSize[sb].y; test: PW.Object _ PW.CreateEmptyCell[]; [] _ PW.IncludeInCell[test, bottom, [2*dx1, 0]]; [] _ PW.IncludeInCell[test, top, [2*dx1, dy1 + dy2]]; [] _ PW.IncludeInCell[test, left, [0, 2*dy1]]; [] _ PW.IncludeInCell[test, sb, [dx1 , dy1]]; [] _ PW.IncludeInCell[test, right, [dx1 + dx2, 2*dy1]]; PW.RepositionCell[test]; RETURN[test]; END; TestPinsH: PW.UserProc = BEGIN routerParams: PWRoute.RouterParams _ NEW[PWRoute.RouterParamsRec _ ["metal", "metal2"]]; left: PW.Object _ PW.Get[design, "PinsLeft"]; right: PW.Object _ PW.Get[design, "PinsRight"]; top: PW.Object _ PW.Get[design, "PinsTop"]; bottom: PW.Object _ PW.Get[design, "PinsBottom"]; h: INT _ MAX[IRSize[bottom].x, IRSize[top].x]; v: INT _ MAX[IRSize[left].y, IRSize[right].y]; dy1: INT _ IRSize[bottom].y; dx1: INT _ IRSize[left].x; -- rect: PWRoute.RefRect _ NEW[PWRoute.Rect _ [-dx1, -dy1, h + dx1, v + dy1]]; sb: PW.Object _ PWRoute.MakeChannel[bottom, top, left, right, NIL -- rect --, routerParams, FALSE, channel]; dx2: INT _ IRSize[sb].x; dy2: INT _ IRSize[sb].y; test: PW.Object _ PW.CreateEmptyCell[]; [] _ PW.IncludeInCell[test, bottom, [dx1, 0]]; [] _ PW.IncludeInCell[test, top, [dx1, dy1 + dy2]]; [] _ PW.IncludeInCell[test, left, [0, dy1]]; [] _ PW.IncludeInCell[test, sb, [dx1 , dy1]]; [] _ PW.IncludeInCell[test, right, [dx1 + dx2, dy1]]; PW.RepositionCell[test]; RETURN[test]; END; TestVias: PW.UserProc = BEGIN pos: CD.Position _ [0, 0]; maxY: INT _ 200; maxX: INT _ 200; metal: CD.Layer _ CD.FetchLayer[design.technology, $met]; metal2: CD.Layer _ CD.FetchLayer[design.technology, $met2]; test: PW.Object _ PW.CreateEmptyCell[]; FOR y: INT _ 48, y+16 WHILE y <= maxY DO pos _ [0, pos.y + y]; FOR x: INT _ 48, x+16 WHILE x <= maxX DO pos.x _ pos.x + x; RouteUtil.AddVia[test, Rope.Cat[Convert.RopeFromInt[x], "x", Convert.RopeFromInt[y]], pos, [x,y], metal, metal2, design.technology.lambda]; ENDLOOP; ENDLOOP; PW.RepositionCell[test]; RETURN[test]; END; TestMulDL: PW.UserProc = BEGIN right, top, bottom, left, sb, row, test: PW.Object; dx1, dy1, dy2: INT; routerParams: PWRoute.RouterParams _ NEW[PWRoute.RouterParamsRec _ ["metal", "metal2"]]; right _ PW.Get[design, "MulDLRight"]; top _ PW.Get[design, "MulDLTop"]; bottom _ PW.Get[design, "MulDLBottom"]; left _ PW.Get[design, "MulDLLeft"]; sb _ PWRoute.AbutSbRoute[bottom, right, top, left, horizontal, routerParams]; row _ PW.AbutListX[LIST[left, sb, right]]; test _ PW.CreateEmptyCell[]; dx1 _ IRSize[left].x; dy1 _ IRSize[bottom].y; dy2 _ IRSize[row].y; [] _ PW.IncludeInCell[test, bottom, [dx1, 0]]; [] _ PW.IncludeInCell[test, row, [0 , dy1]]; [] _ PW.IncludeInCell[test, top, [dx1, dy1 + dy2]]; PW.RepositionCell[test]; RETURN[test]; END; TestSbRouterV: PW.UserProc = BEGIN left, right, top, bottom, sb, row, test: PW.Object; dx1, dy1, dy2: INT; left _ PW.Get[design, "SbYleft"]; right _ PW.Get[design, "SbYright"]; top _ PW.Get[design, "SbYtop"]; bottom _ PW.Get[design, "SbYbottom"]; sb _ PWRoute.AbutSbRoute[bottom, right, top, left, vertical]; row _ PW.AbutListX[LIST[left, sb, right]]; test _ PW.CreateEmptyCell[]; dy1 _ IRSize[bottom].y; dy2 _ IRSize[row].y; dx1 _ IRSize[left].x; [] _ PW.IncludeInCell[test, bottom, [dx1, 0]]; [] _ PW.IncludeInCell[test, row, [0 , dy1]]; [] _ PW.IncludeInCell[test, top, [dx1, dy1 + dy2]]; PW.RepositionCell[test]; RETURN[test]; END; TestSbMMRouterV: PW.UserProc = BEGIN routerParams: PWRoute.RouterParams _ NEW[PWRoute.RouterParamsRec _ ["metal2", "metal", design.technology.key]]; leftOrig: PW.Object _ PW.Get[design, "SbMMleft"]; leftXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, leftOrig, right, 50, "metal"]; left: PW.Object _ PW.AbutX[leftOrig, leftXfer]; rightOrig: PW.Object _ PW.Get[design, "SbMMright"]; rightXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, rightOrig, left, 50, "metal"]; right: PW.Object _ PW.AbutX[rightXfer, rightOrig]; topOrig: PW.Object _ PW.Get[design, "SbMMtop"]; topXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, topOrig, bottom, 50, "metal2"]; top: PW.Object _ PW.AbutY[topXfer, topOrig]; bottomOrig: PW.Object _ PW.Get[design, "SbMMbottom"]; bottomXfer: PW.Object _ PWRoute.XferPins[routerParams.technologyKey, bottomOrig, top, 50, "metal2"]; bottom: PW.Object _ PW.AbutY[bottomOrig, bottomXfer]; sb: PW.Object _ PWRoute.AbutSbRoute[bottom, right, top, left, vertical, routerParams]; row: PW.Object _ PW.AbutListX[LIST[left, sb, right]]; test: PW.Object _ PW.CreateEmptyCell[]; dy1: INT _ IRSize[bottom].y; dy2: INT _ IRSize[row].y; dx1: INT _ IRSize[left].x; [] _ PW.IncludeInCell[test, bottom, [dx1, 0]]; [] _ PW.IncludeInCell[test, row, [0 , dy1]]; [] _ PW.IncludeInCell[test, top, [dx1, dy1 + dy2]]; PW.RepositionCell[test]; RETURN[test]; END; TestIFUMMH: PW.UserProc = BEGIN routerParams: PWRoute.RouterParams _ NEW[PWRoute.RouterParamsRec _ ["metal", "metal2", design.technology.key]]; left: PW.Object _ PW.Get[design, "left"]; right: PW.Object _ PW.Get[design, "right"]; top: PW.Object _ NIL; bottom: PW.Object _ PW.Get[design, "bottom"]; test: PW.Object _ PWRoute.MakeChannel[bottom, top, left, right, NIL -- rect --, routerParams, FALSE, channel]; -- test: PW.Object _ PWRoute.AbutChRouteListY[LIST[bottom, top], LIST[left], LIST[right], routerParams]; RETURN[test]; END; EUWireWidth: PWRoute.WireWidthProc ~ { IF Rope.Equal[netName, "Vdd"] OR Rope.Equal[netName, "Gnd"] THEN wireWidth _ 736 ELSE wireWidth _ 32}; TestEUMMV: PW.UserProc = BEGIN routerParams: PWRoute.RouterParams _ NEW[PWRoute.RouterParamsRec _ [trunkLayer: "metal2", branchLayer: "metal", technologyKey: design.technology.key, wireWidthProc: EUWireWidth]]; left: PW.Object _ PW.Get[design, "LeftSide"]; right: PW.Object _ PW.Get[design, "RightSide"]; top: PW.Object _ PW.Get[design, "TopSide"]; bottom: PW.Object _ PW.Get[design, "BottomSide"]; test: PW.Object _ PWRoute.AbutChRouteListX[LIST[left, right], LIST[bottom], LIST[top], routerParams]; RETURN[test]; END; TestEUMMH: PW.UserProc = BEGIN routerParams: PWRoute.RouterParams _ NEW[PWRoute.RouterParamsRec _ [trunkLayer: "metal", branchLayer: "metal2", technologyKey: design.technology.key]]; left: PW.Object _ PW.Get[design, "EULeft"]; right: PW.Object _ PW.Get[design, "EURight"]; top: PW.Object _ PW.Get[design, "EUTop"]; bottom: PW.Object _ PW.Get[design, "EUBottom"]; test: PW.Object _ PWRoute.AbutChRouteListY[LIST[bottom, top], LIST[left], LIST[right], routerParams]; RETURN[test]; END; TestSb2Sides: PW.UserProc = BEGIN leftOrig: PW.Object _ PW.Get[design, "Sb2left"]; leftXfer: PW.Object _ PWRoute.XferPins[design.technology.key, leftOrig, right, 0, "poly"]; left: PW.Object _ PW.AbutX[leftOrig, leftXfer]; bottomOrig: PW.Object _ PW.Get[design, "Sb2bottom"]; bottomXfer: PW.Object _ PWRoute.XferPins[design.technology.key, bottomOrig, top, 50, "metal"]; bottom: PW.Object _ PW.AbutY[bottomOrig, bottomXfer]; sb: PW.Object _ PWRoute.AbutSbRoute[bottom, NIL, NIL, left, vertical]; row: PW.Object _ PW.AbutListX[LIST[left, sb]]; test: PW.Object _ PW.CreateEmptyCell[]; dy: INT _ IRSize[bottom].y; dx: INT _ IRSize[left].x; [] _ PW.IncludeInCell[test, bottom, [dx, 0]]; [] _ PW.IncludeInCell[test, row, [0 , dy]]; PW.RepositionCell[test]; RETURN[test]; END; PW.Register[TestChRouterX, "TestChRouterX"]; PW.Register[TestChRouterY, "TestChRouterY"]; PW.Register[TestSbRouterH, "TestSbRouterH"]; PW.Register[TestSbSmlRouterH, "TestSbSmlRouterH"]; PW.Register[TestSbRouterV, "TestSbRouterV"]; PW.Register[TestSb2Sides, "TestSb2Sides"]; PW.Register[TestSbMMRouterV, "TestSbMMRouterV"]; PW.Register[TestPinsH, "TestPinsH"]; PW.Register[TestMulDL, "TestMulDL"]; PW.Register[TestVias, "TestVias"]; PW.Register[TestEUMMV, "TestEUMMV"]; PW.Register[TestEUMMH, "TestEUMMH"]; PW.Register[TestIFUMMH, "TestIFUMMH"]; END. ΄PWRouteTest.mesa Copyright c 1985, 1986 by Xerox Corporation. All rights reversed. Bryan Preas March 26, 1986 6:06:29 pm PST Use with the file PWRouteTest.dale to test routing: CDCmosB (or CDCmosA) PWRoute.load cdread PWRouteTest -- NOTE: PWRouteTest.dale must be in the /// directory run PWRouteTest middle click P in the ChipNDale viewer select the appropriate generator use design RightChannel.dale use design EUControl.dale Κ p˜– "Cedar" stylešœ™Jšœ Οmœ7™BIcode™)J˜—šœ3™3J™Jšœ ™ JšœI™IJšœ™J™&J™ —J˜šΟk œ˜ Jšœž œ˜4—J˜šœ žœžœ˜Jšžœž œ˜>Jšžœ˜J˜Jšžœžœžœ˜J˜š Οnœžœžœžœžœ ˜;Jšœ3˜3J˜—šΟb œžœ ˜Jšž˜Jšœ%žœG˜oJ˜Jšœ žœ žœ˜0Jšœ žœ žœD˜aJšœžœ žœ˜/Jšœ žœ žœ˜2Jšœ žœ žœD˜bJšœžœ žœ˜2Jšœ žœ žœ˜.Jšœ žœ žœE˜aJšœžœ žœ˜,Jšœ žœ žœ˜4Jšœ žœ žœE˜dJšœžœ žœ˜5Jš œžœ#žœžœ žœ˜eJšžœ˜ Jšžœ˜J˜—š  œžœ ˜Jšž˜Jšœ žœ˜*Jšœžœ˜!Jšœžœ˜#Jšœžœ˜Jšœ žœ˜%Jšœ žœžœžœ ˜LJšžœ˜ Jšžœ˜—J˜š  œžœ ˜Jšž˜Jšœ,žœ˜6Jšœžœ˜J˜Jšœžœ˜!Jšœžœ˜#Jšœžœ˜Jšœ žœ˜%Jšœ?˜?Jšœ žœ žœ˜-Jšœžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœžœ%˜,Jšœžœ(˜/Jšœžœ.˜5J˜Jšžœ˜Jšžœ˜J˜—š œžœ ˜Jšž˜Jšœžœ žœ˜/Jšœžœ žœ˜1Jšœžœ žœ˜-Jšœžœ žœ˜3Jšœžœ(˜.Jšœžœ(˜.Jšœžœ˜Jšœžœ˜JšœK˜KJ˜JšœžœYžœ ˜sJšœžœ˜Jšœžœ˜Jšœžœ žœ˜'Jšœžœ)˜0Jšœžœ.˜5Jšœžœ'˜.Jšœžœ&˜-Jšœžœ0˜7J˜Jšžœ˜ Jšžœ˜J˜—š  œžœ ˜Jšž˜Jšœ%žœ0˜XJ˜Jšœžœ žœ˜-Jšœžœ žœ˜/Jšœžœ žœ˜+Jšœžœ žœ˜1Jšœžœ(˜.Jšœžœ(˜.Jšœžœ˜Jšœžœ˜JšœN˜NJ˜JšœžœTžœ ˜lJšœžœ˜Jšœžœ˜Jšœžœ žœ˜'Jšœžœ'˜.Jšœžœ,˜3Jšœžœ%˜,Jšœžœ&˜-Jšœžœ.˜5J˜Jšžœ˜ Jšžœ˜J˜—šΠbnœžœ ˜Jšž˜J˜Jšœ˜J˜J˜Jšœžœ žœ%˜9Jšœžœ žœ&˜;Jšœžœžœ˜'J˜šžœžœ žœ ž˜(Jšœ˜šžœžœ žœ ž˜(J˜Jšœ‹˜‹Jšžœ˜—Jšžœ˜J˜—Jšžœ˜Jšžœ˜ Jšžœ˜J˜—š  œžœ ˜Jšž˜Jšœ)žœ˜3Jšœžœ˜J˜Jšœ%žœ0˜XJ˜Jšœžœ˜%Jšœžœ˜!Jšœ žœ˜'Jšœžœ˜#JšœM˜MJšœžœ žœ˜*Jšœžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœžœ'˜.Jšœžœ%˜,Jšœžœ,˜3J˜Jšžœ˜ Jšžœ˜J˜—š  œžœ ˜Jšž˜Jšœ)žœ˜3Jšœžœ˜J˜Jšœžœ˜!Jšœžœ˜#Jšœžœ˜Jšœ žœ˜%Jšœ=˜=Jšœžœ žœ˜*Jšœžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœžœ'˜.Jšœžœ%˜,Jšœžœ,˜3J˜Jšžœ˜ Jšžœ˜—J˜š œžœ ˜Jšž˜J˜Jšœ%žœG˜oJ˜Jšœ žœ žœ˜1Jšœ žœ žœD˜aJšœžœ žœ˜/Jšœ žœ žœ˜3Jšœ žœ žœD˜bJšœžœ žœ˜2Jšœ žœ žœ˜/Jšœ žœ žœE˜aJšœžœ žœ˜,Jšœ žœ žœ˜5Jšœ žœ žœE˜dJšœžœ žœ ˜6JšœžœP˜VJšœžœ žœ žœ˜5Jšœžœ žœ˜'Jšœžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ'˜.Jšœžœ%˜,Jšœžœ,˜3J˜Jšžœ˜ Jšžœ˜J˜—šŸ œžœ ˜Jšž˜J˜Jšœ%žœG˜oJ˜Jšœžœ žœ˜)Jšœžœ žœ˜+Jšœžœ žœ˜Jšœžœ žœ˜-Jš œžœ8žœΟc œžœ ˜nJš œ žœ#žœžœžœ˜hJšžœ˜ Jšžœ˜J˜—šŸ œ˜&Kšžœžœžœ˜PKšžœ˜K˜—š‘ œžœ ˜Jšž˜J˜Jšœ™Jšœ%žœ‹˜³J˜Jšœžœ žœ˜-Jšœžœ žœ˜/Jšœžœ žœ˜+Jšœžœ žœ˜1Jš œžœ#žœžœ žœ˜eJšžœ˜ Jšžœ˜J˜—š‘ œžœ ˜Jšž˜J˜Jšœ™Jšœ%žœo˜—J˜Jšœžœ žœ˜+Jšœžœ žœ˜-Jšœžœ žœ˜)Jšœžœ žœ˜/Jš œžœ#žœžœžœ˜eJšžœ˜ Jšžœ˜J˜—š  œžœ ˜Jšž˜J˜Jšœ žœ žœ˜0Jšœ žœN˜ZJšœžœ žœ˜/Jšœ žœ žœ˜4Jšœ žœP˜^Jšœžœ žœ˜5Jšœžœ&žœžœ˜FJšœžœ žœ žœ ˜.Jšœžœ žœ˜'Jšœžœ˜Jšœžœ˜Jšœžœ&˜-Jšœžœ$˜+J˜Jšžœ˜ Jšžœ˜—J˜Jšžœ*˜,Jšžœ*˜,Jšžœ*˜,Jšžœ0˜2Jšžœ*˜,Jšžœ(˜*Jšžœ.˜0Jšžœ"˜$Jšžœ"˜$Jšžœ ˜"Jšžœ"˜$Jšžœ"˜$Jšžœ$˜&Jšžœ˜——…—)Ψ7ό