//route.bcpl // Main driver module // last modified by Rumph, March 8, 1985 5:13 PM // to add stuff to split the output wirelist, if necessary for FAB // also changes to route.defs, routeinit.bcpl, routeb.bcpl // modified by Rumph, December 5, 1984 5:25 PM // version date change only here // real fixes RouteCombin.bcpl and RouteNetRes.bcpl // modified by Rumph, November 27, 1984 4:45 PM // version date change only -- real changes in RouteCombin.bcpl // modified by Rumph, October 30, 1984 5:18 PM // version date change only -- real changes in RouteBoard.bcpl // modified by McCreight, October 30, 1981 2:58 PM get "sysdefs.d" get "streams.d" get "route.defs" external [ Ws Junta CounterJunta UserReadOverlay LockPendingCode ReleaseOverlay ReadOverlay OverlayFirstPn OverlayNpages @OverlaySave DeclareOverlayPresent currOverlay initCodeEnd overlayCore npBiggestOverlay dsp ] static [(635)\f1 worstErrorLevel = noError inputKf routeVersion swapZone = empty currOverlay = emptyl4269\f1 ] let Main(blv,params,cfa) be [\f1 routeVersion = "Route - March 8, 1985" PutTemplate(dsp, "*n*n*n*n*n$S", routeVersion) OnceOnlyInitCode(blv,params,cfa) Junta(levStreams,DoRoute)l4268\f1 ] and SayGoodbye() be [\f1 PutTemplate(dsp, "$S ... finished", routeVersion) finishl4269\f1 ] and SwapIn(ent) be [\f1 if ent!1 eq #6000+lv OverlaySave then [ // JSR@ OverlaySave means swapped-out special entryl4268\f1 let od = ent!2 DeclareOverlayPresent(od, UserReadOverlay(od))l5538\f1 ] l4268\f1 ] and UserReadOverlay(od) = valof [\f1 if currOverlay ne empty then [l4268\f1 LockPendingCode() test ReleaseOverlay(currOverlay, false) ifnot CallSwat("Two overlays contending for overlay space") ifso [l5538\f1 ReleaseOverlay(currOverlay, true) currOverlay = emptyl6808\f1 ]l5538\f1 ] if swapZone ne empty & Usc(overlayCore+256*OverlayNpages(od), swapZone) ge 0 then CallSwat("Overlay wants swapZone space") ReadOverlay(OverlayFirstPn(od), overlayCore, OverlayNpages(od)) currOverlay = od resultis overlayCorel4268\f1 ]\f1 and DoRoute(arg) be [\f1 static [ stackNeeds = 1000 ] AddSpace(stackNeeds) // leave for stack AddToZone(SilZone, OnceOnlyInitCode, initCodeEnd-OnceOnlyInitCode+1) let fileZone = InitializeZone(Allocate(SilZone, 400), 400) //now do the real work on all the files inputKf = kf until inputKf eq empty do [l4268\f1 if inputKf>>KF.input then [l5538\f1 let File = GetFile(lv inputKf>>KF.string, 0, 0, fileZone) //open the input file Remark("*nReading $S", lv inputKf>>KF.string) FileIn(File) Closes(File)l6808\f1 ] inputKf = inputKf>>KF.nextl5538\f1 ] Free(SilZone, fileZone) Puts(ImplicitFile, $*n) TruncateDiskStream(ImplicitFile) Resets(ImplicitFile) Remark("*nReading $S.inl, the implicit power wiring", nlFileName) FileIn(ImplicitFile) Closes(CommentsFile) CommentsFile = empty let oldImplicitPos = vec 2 FilePos(ImplicitFile, oldImplicitPos) TruncateDiskStream(ImplicitFile) if Correcting then [l4268(1270)\f1 OldWlFile = GetFile(wlOldFileName,"",charItem) //For comparison let oldBoardType = vec 20 let nchars = 0 let char = Gets(OldWlFile) while char ne $*n do [l5538(635)\f1 nchars = nchars+1 oldBoardType>>str.char^nchars = char char = Gets(OldWlFile)l6808\f1 ] oldBoardType>>str.length = nchars if StComp(oldBoardType, ZeroTablePoint(0)) ne 0 then Disaster("Board type differs from original")l5538\f1 CorrelateOldAndNew() Closes(OldWlFile) OldWlFile = emptyl5538(1270)\f1 ] unless noroute do [l4268\f1 MapNamees(typeIcclass, LocateAvailTerms) MapNamees(typeNet, RouteEarlyNets) MapNamees(typeNet, AddEclTerminators) MapNamees(typeNet, RouteNetIfExternal) MapNamees(typeNet, AddEclTerminators)l5538\f1 ] let capsAdded = false unless noroute do [l4268\f1 MapNamees(typeNet, RouteNet) MapNamees(typeNet, AddEclTerminators) // may add new stuffl5538\f1 ] until noroute do [l4268\f1 let newImplicitPos = vec 2 FilePos(ImplicitFile, newImplicitPos) if oldImplicitPos!0 eq newImplicitPos!0 & oldImplicitPos!1 eq newImplicitPos!1 then test capsAdded ifso break ifnot [ AddDecouplingCaps(); capsAdded=true; loop ] SetFilePos(ImplicitFile, oldImplicitPos) // More implicit stuff ReadAllNetLines(ImplicitFile) FilePos(ImplicitFile, oldImplicitPos) TruncateDiskStream(ImplicitFile) MapNamees(typeNet, RouteNet) MapNamees(typeNet, AddEclTerminators) // may add new stuffl5539\f1 ] Closes(ImplicitFile) ImplicitFile = empty MapNamees(typeIcclass, FreeTermStorage) // no more terminators if coveredAreas ne 0 then Free(SilZone, coveredAreas) // no more IC's to insert coveredAreas = 0 MapNamees(typeIcinst, CheckUnusedPins) MapNamees(typeNet, AssignTWNet) if Correcting then CorrelateRemaining() unless noroute do MapNamees(typeNet, RouteNet) // trace-wired stuff unless noroute do [l4269\f1 MapNamees(typeNet, ComputeLengths) DoInSortOrder(typeNet, NLCompFn, AssignNetNumber)l5539\f1 ] netOffset = 0 OutFile = GetFile(nlFileName,".ics",charItem) //ics file MakeOutputFile(OutFile, isICFile) Puts(OutFile, $*n); TruncateDiskStream(OutFile); Closes(OutFile) OutFile = GetFile(wlNewFileName,"",charItem) //wire list MakeOutputFile(OutFile, isWLFile) Puts(OutFile, $*n); TruncateDiskStream(OutFile); Closes(OutFile) if baseNetNumber gr outLimit then [l4269\f1 outThreshold = savedOutThreshold OutFile = GetFile(wlNewFileName,"1",charItem) //wire list MakeOutputFile(OutFile, isWLSplitFile) Puts(OutFile, $*n); TruncateDiskStream(OutFile); Closes(OutFile) netOffset = netCount OutFile = GetFile(wlNewFileName,"2",charItem) //wire list MakeOutputFile(OutFile, isWLSplitFile) Puts(OutFile, $*n); TruncateDiskStream(OutFile); Closes(OutFile) outThreshold = infinity netOffset = 1l5539\f1 ] if Correcting then [l4269\f1 ADFile = GetFile(nlFileName,".ad",charItem) // add/delete list MakeOutputFile(ADFile, isADFile) Puts(ADFile, $*n); TruncateDiskStream(ADFile);Closes(ADFile)l5539\f1 ] MapNamees(typeIcinst, MakeConnInstFile) MakeOldBPFile() MakeLoadingChart() if doMultiWire then MultiWire() if doPC then PC() if doResistances then MakeResistanceFile() Puts(ErFile, $*n); TruncateDiskStream(ErFile); Resets(ErFile) Gets(ErFile); Puts(ErFile, $0+worstErrorLevel); Closes(ErFile) CounterJunta(SayGoodbye)l4268(635)\f1 ] and GetFile(fname,ext,byteword,zone; numargs na) = valof //1 for bytes,0 for words [\f1 DefaultArgs(lv na, -1, "", charItem, SilZone) let v = vec 128 ExpandTemplate(v, "$S$S", fname, ext) //add the extension let kfIndex = kf while kfIndex ne empty do [l4268\f1 let d = StComp(v, lv kfIndex>>KF.string) if d gr 1 % d ls -1 then [l5538\f1 kfIndex = kfIndex>>KF.next loopl6808\f1 ] let file = CreateDiskStream(lv kfIndex>>KF.fp, ksTypeReadWrite, byteword, 0, 0, zone) if file eq 0 then CallSwat("Can't open file ", lv kfIndex>>KF.string) resultis filel5538\f1 ] CallSwat("Unanticipated file: ", v)l4268\f1 ]\f1 and WeAre(doingWhat) be [\f1 static [ lastThing=0; lastX=0; lastY=0 ] if doingWhat ne lastThing then // change cursor [l4269\f1 manifest [ A=1; B=2; C=4; D=#10; E=#20; F=#40; G=#100 ] let segments = table [l5539\f1 A+B+C+D+E+F // 0 B+C // 1 A+B+G+E+D // 2 A+B+G+C+D // 3 F+G+B+C // 4 A+F+G+C+D // 5 A+F+E+D+C+G // 6 A+B+C // 7 A+B+C+D+E+F+G // 8 A+F+G+B+C // 9l6809\f1 ]!doingWhat @#431 = (segments&A) ne 0? #77000, 0 for i=1 to 6 do @(#431+i) = ((segments&F) ne 0? #100000, 0)+((segments&B) ne 0? #400, 0) @(#431+7) = (segments&G) ne 0? #77000, 0 for i=8 to 13 do @(#431+i) = ((segments&E) ne 0? #100000, 0)+((segments&C) ne 0? #400, 0) @(#431+14) = (segments&D) ne 0? #77000, 0 @(#431+15) = 0 lastThing = doingWhatl5539\f1 ] lastX = lastX+4 if lastX gr 400 then [l4269\f1 lastX = 0 lastY = lastY+16 if lastY gr 600 then lastY = 0l5539\f1 ] @#426 = lastX+100 @#427 = lastY+100l4269\f1 ] \f1