// RouteUniversal.bcpl // Route characterization for a board of infinite extent // in which all IC locations are non-overlapping. // Useful for producing node lists for transport to foreign systems. // Last modified April 13, 1983 5:14 PM by Boggs get "route.defs" static [ maxICs = 500 boardInterfaceVersioon = interfaceVersion lq nextX = 0; minX; maxX nextY = 64; minY; maxY ] //----------------------------------------------------------------------------------------- let ZeroTablePoint(point) = selecton point into //----------------------------------------------------------------------------------------- [ case 0: "Universal" case 1: "#TopLeft" case 2: "#TopRight" case 3: "#BottomRight" case 4: "#BottomLeft" default: "#?" ] //----------------------------------------------------------------------------------------- and LevelTransform(level, x, y, pX, pY, pName, pPullComponents, pWire; numargs na) = valof //----------------------------------------------------------------------------------------- [ DefaultArgs(lv na, -1, 0, 0, lv na, lv na, lv na, lv na, lv na) switchon level into [ case TopLevel: [ @pX, @pY = x, y @pName = "component side" @pPullComponents = true @pWire = false resultis true ] case BottomLevel: [ @pX, @pY = x, y @pName = "wiring side" @pPullComponents = false @pWire = true resultis true ] default: resultis false ] ] //----------------------------------------------------------------------------------------- and DeclareInitialNets(BuildTWNet, BuildTermNet, BuildConnector) be //----------------------------------------------------------------------------------------- [ BuildConnector("E", 1000, EPinPos) BuildConnector("C", 1000, CPinPos) ] //----------------------------------------------------------------------------------------- and EPinPos(icinst, pin, pX, pY, pInfo; numargs na) = valof //----------------------------------------------------------------------------------------- [ DefaultArgs(lv na, -4, lv na) @pInfo = noDisconnect+noReconnect+BottomLevel @pX = (pin & 177b) lshift 2 @pY = (pin & not 177b) rshift 5 resultis absolute ] //----------------------------------------------------------------------------------------- and CPinPos(icinst, pin, pX, pY, pInfo; numargs na) = valof //----------------------------------------------------------------------------------------- [ DefaultArgs(lv na, -4, lv na) @pInfo = noDisconnect+noReconnect+BottomLevel @pX = (pin & 177b) lshift 2 @pY = (pin & not 177b) rshift 5 + 32 resultis absolute ] //----------------------------------------------------------------------------------------- and BoardPinCoord(string, icinst, pinNo, pX, pY) = valof //----------------------------------------------------------------------------------------- [ structure String [ length byte; char↑1,1 byte ] structure Loc: [ link word x word y word @String ] manifest lenLoc = size Loc/16 let vop, hop = nil, nil switchon (Icclass(icinst)>>icclass.PinOffset)(icinst, pinNo, lv vop, lv hop) into [ case absolute: [ @pX, @pY = vop, hop; resultis true ] case relative: [ let loc = lq; while loc ne 0 do [ let found = loc>>Loc.length eq string>>String.length if found then for i = 1 to loc>>Loc.length do if loc>>Loc.char↑i ne string>>String.char↑i then [ found = false; break ] if found break loc = loc>>Loc.link ] if loc eq 0 then [ loc = Allocate(SilZone, string>>String.length lshift 1 +lenLoc) loc>>Loc.length = string>>String.length for i = 1 to loc>>Loc.length do loc>>Loc.char↑i = string>>String.char↑i minX, maxX = 0, 0 for pin = 1 to Npins(icinst) do [ let xOff, yOff = nil, nil (Icclass(icinst)>>icclass.PinOffset)(icinst, pin, lv yOff, lv xOff) if xOff ls minX then minX = xOff if xOff gr maxX then maxX = xOff if yOff ls minY then minY = yOff if yOff gr maxY then maxY = yOff ] loc>>Loc.y = nextY loc>>Loc.x = nextX - minX nextX = nextX + maxX - minX +4 if nextX gr 900 then //"carriage return" to avoid coordiantes > 1023 [ nextX = 0 nextY = nextY + maxY - minY +4 minY, maxY = 0, 0 ] loc>>Loc.link = lq; lq = loc ] @pY = loc>>Loc.y + vop @pX = loc>>Loc.x + hop resultis true ] default: resultis false ] ] //----------------------------------------------------------------------------------------- and FindIndexFromCoord(x, y, pIcclass, pPinNo; numargs na) = 1 //----------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------- and FindCoordFromString(string, pX, pY, vop, hop; numargs na) = valof //----------------------------------------------------------------------------------------- [ DefaultArgs(lv na, -3, 0, 0) @pX, @pY = hop, vop resultis absolute ]