-- beadsCtl23.mesa -- went to long pointers -- buried contacts -- edge to edge constraints (flying wires) DIRECTORY IODefs:FROM"IODefs", SystemDefs:FROM"SystemDefs", ImageDefs:FROM"ImageDefs", StringDefs:FROM"StringDefs", InlineDefs:FROM"InlineDefs", MiscDefs:FROM"MiscDefs", StreamDefs:FROM"StreamDefs", BeadsDefs:FROM"BeadsDefs"; BeadsCtl:PROGRAM IMPORTS ImageDefs, InlineDefs, IODefs, StringDefs, MiscDefs, BeadsDefs, StreamDefs, SystemDefs = BEGIN OPEN BeadsDefs; Error:SIGNAL=CODE; firstTime,time:LONG CARDINAL; fileName:STRING_ [50]; cleanup,showSticks,doWires,doLocal,doCompression,processedBeads, onePass,scour,moreBelow,dMachine,drop:BOOLEAN; bothWays,disp,printAtBeginning,printAtEnd,lookAtBelow:BOOLEAN_FALSE; replicateH,replicateV,swivel:CARDINAL; -- ////// CONTROL ////// --Get:PROCEDURE[i:CARDINAL]RETURNS[BeadPtr]=INLINE --BEGIN RETURN[LOOPHOLE[bead,BeadPtr]+InlineDefs.LongMult[i,SIZE[Bead]]]; END; Main:PROCEDURE=BEGIN s:CARDINAL; BeadsDefs.ShowStats["Beads Program Version=",1,5]; desP_@des; SetDesTables[]; DO -- ///////////////GET READY///////////// InterrogateUserForParameters[]; AllocateBelowNoodle[]; AllocateBeadTable[]; GoGetTheBeads[]; AllocateWorkTable[]; FOR s IN [0..swivel) DO Rotate[]; ENDLOOP; Replicate[TRUE]; Replicate[FALSE]; ScavageBeads[]; IF printAtBeginning THEN PrintG[]; IF disp THEN BEGIN StartDisplay[]; InitBeadWorking[]; Display[]; END; FindBoundingBox[]; WriteOneNumber["Starting compression: ",maxX]; IODefs.WriteNumber[maxY, [10,FALSE,TRUE,5]]; IODefs.WriteChar[CR]; -- ///////////////COMPRESS///////////// bendingWires_FALSE; IF doCompression THEN Squeeze[16,FALSE]; IF doCompression THEN Squeeze[16,TRUE]; IF doCompression THEN Squeeze[8,FALSE]; IF doCompression THEN Squeeze[8,TRUE]; IF doCompression OR onePass THEN Squeeze[1,FALSE]; IF doCompression OR onePass THEN Squeeze[1,TRUE]; IF doLocal THEN Local[]; IF doLocal THEN Squeeze[1,FALSE]; IF doLocal THEN Squeeze[1,TRUE]; IF doLocal THEN BEGIN CheckBeads[]; ShowTime["local time = "]; END; bendingWires_TRUE; IF doWires THEN Squeeze[1,FALSE]; IF drop THEN Drop[FALSE]; IF doWires AND bothWays THEN Squeeze[1,TRUE]; IF drop THEN Drop[TRUE]; -- ///////////////TIDY UP///////////// FullTest[]; TidyUp[]; IF printAtEnd THEN PrintG[]; IF disp AND BeadsDefs.ManipulateDisplay[] THEN PrintG[]; IF AskUser["Do you want to write out a file? "] THEN WriteOutBeads[]; IF ~dMachine THEN SystemDefs.FreeSegment[InlineDefs.LowHalf[bead]]; FreeBelowNoodle[]; ENDLOOP; END; Drop:PROCEDURE[rot:BOOLEAN]=BEGIN timeV5_timeV6_0; time_MiscDefs.CurrentTime[]; IF rot THEN BeadsDefs.Reflect[]; FindBoundingBox[]; InitBeadWorking[]; SortOnY[]; ShowTime["init time = "]; MakeBelow[]; ShowTime["below time = "]; PrintSomeBelowStuff[]; Clean[]; ShowTime["drop time = "]; -- IF scour THEN ScourBeads[]; TurnWiresToBeads[]; ScavageBeads[]; ShowTime["cleanup time = "]; IF rot THEN BeadsDefs.Reflect[]; FindBoundingBox[]; IF disp THEN Display[]; WriteOneNumber["Dropped: ",0]; END; Squeeze:PROCEDURE[howMuch:CARDINAL,rot:BOOLEAN]=BEGIN timeV5_timeV6_0; time_MiscDefs.CurrentTime[]; IF rot THEN BeadsDefs.Reflect[]; FindBoundingBox[]; InitBeadWorking[]; SortOnY[]; ShowTime["init time = "]; MakeBelow[]; ShowTime["below time = "]; PrintSomeBelowStuff[]; PutTheBeadsWhereTheyBelong[bendingWires,howMuch]; ShowTime["position time = "]; IF cleanup THEN CleanUp[]; IF scour THEN ScourBeads[]; TurnWiresToBeads[]; ScavageBeads[]; ShowTime["cleanup time = "]; IF rot THEN BeadsDefs.Reflect[]; FindBoundingBox[]; IF disp THEN Display[]; IF rot THEN WriteOneNumber[" New X: ",maxX] ELSE WriteOneNumber[" New Y: ",maxY]; WriteOneNumber["Squeezed: ",howMuch]; END; PrintSomeBelowStuff:PROCEDURE=BEGIN IF lookAtBelow THEN ShowBelow[]; IODefs.WriteChar[CR]; IODefs.WriteString["Below Counts "]; PrintLong[timeV6]; PrintLong[timeV5]; END; TidyUp:PROCEDURE=BEGIN PrintBeads[]; IF ~dMachine THEN SystemDefs.FreeSegment[InlineDefs.LowHalf[work]]; time_firstTime; ShowTime["total time = "]; WriteOneNumber["final number of beads= ",topBead]; MeasureWires[]; WriteOneNumber["worst size of Below Table= ",worstBelow]; END; MeasureWires:PROCEDURE=BEGIN countT,countW,lengthW:INTEGER_0; MeasureWire:PROCEDURE[i:CARDINAL,bpi:BeadPtr]=BEGIN IF bpi.wire THEN BEGIN countW_countW+1; lengthW_lengthW+(IF bpi.beadU=noBead THEN bpi.w ELSE bpi.h); END; SELECT bpi.t FROM tt,ttV,dd,ddV=>countT_countT+1; ENDCASE; END; EnumerateBeads[MeasureWire]; WriteOneNumber["number of wires= ",countW]; WriteOneNumber["total length of wires= ",lengthW]; WriteOneNumber["number of transistors= ",countT]; END; AllocateBelowNoodle:PROCEDURE=BEGIN OPEN SystemDefs; AllocateBelow[]; noodleChain_AllocateSegment[topNoodle+1]; noodleDX_AllocateSegment[topNoodle+1]; noodleDY_AllocateSegment[topNoodle+1]; END; FreeBelowNoodle:PROCEDURE=BEGIN OPEN SystemDefs; FreeBelow[]; FreeSegment[noodleChain]; FreeSegment[noodleDX]; FreeSegment[noodleDY]; END; InterrogateUserForParameters:PROCEDURE=BEGIN DO IODefs.WriteChar[CR]; replicateH_replicateV_1; bothWays_fallBack_disp_debugBeads_lookAtBelow_showSticks _printAtBeginning_ getWhatYouSee _FALSE; scour_moreBelow_TRUE; swivel_worstBelow_0; trackBead_177777B; AskForFileName["input file name= "]; IF fileName.length=0 THEN ImageDefs.StopMesa[]; processedBeads_ AskUser["Is your input preprocessed? "]; dMachine_AskUser["Are you using a d machine's extra memory? "]; noBead_IF dMachine THEN 8000 ELSE AskUserSize["Is your input small, medium, or large (s,m,or l)? "]; IF AskUser["Do you want debugging aids? "] THEN BEGIN getWhatYouSee_ AskUser["Do you want to turn on getWhatYouSee? "]; scour_ ~AskUser["Do you want to turn off Scour beads? "]; showSticks_ AskUser["Do you want me to print the sticks? "]; debugBeads_ AskUser["Do you want me to print the beads? "]; lookAtBelow_ AskUser["Do you want to see BELOW? "]; --moreBelow_ AskUser["Do you want More Below? "]; IF AskUser["Do you want to track a beads? "] THEN BEGIN IODefs.WriteChar[CR]; IODefs.WriteString[" which bead? "]; trackBead _ IODefs.ReadDecimal[]; END; END; IF AskUser["Do you want Standard Processing? "] THEN BEGIN doCompression_~processedBeads; fallBack_cleanup_doWires_bothWays_drop_TRUE; onePass_ doLocal_FALSE; END ELSE BEGIN UNTIL ~AskUser["Rotate the whole picture 90 degrees? "] DO swivel_swivel+1; ENDLOOP; IF AskUser["do you want replication? "] THEN BEGIN UNTIL ~AskUser["horizontal? "] DO replicateH_replicateH+1; ENDLOOP; UNTIL ~AskUser["vertical? "] DO replicateV_replicateV+1; ENDLOOP; END; doCompression_ ~processedBeads AND AskUser["do you want standard compression? "]; onePass_ ~doCompression AND AskUser["do you want one pass compression? "]; cleanup_ AskUser["Do you want cleanup? "]; doWires_ AskUser["Do you want to bend wires? "]; bothWays_ doWires AND AskUser["Both Ways? "]; fallBack_ doWires AND AskUser["Do you want fallback? "]; drop_ AskUser["Do you want capicitance reduction(Drop)? "]; doLocal_ AskUser["Do you want local transformations? "]; END; IF ~AskUser["Do you want to change your mind? "] THEN EXIT; ENDLOOP; printAtEnd_ noBead> 700 AND ~dMachine; smallDisplay_ noBead> 300 AND ~dMachine; disp_ (~printAtBeginning AND ~printAtEnd) OR dMachine; noBelow_ IF dMachine THEN 32000 ELSE 3000; END; GoGetTheBeads:PROCEDURE=BEGIN i:CARDINAL; bpi:BeadPtr; firstTime_time_MiscDefs.CurrentTime[]; IF processedBeads THEN ReadInBeads[] ELSE BeadsDefs.FromInputToBeads[fileName,FALSE]; FOR i IN [0..topBead] DO bpi_Get[i]; IF bpi.t=jctnG THEN BEGIN IF noBead#bpi.beadT THEN Error ELSE EXIT; END; ENDLOOP; WriteOneNumber["number of beads= ",topBead]; ShowTime["readin time = "]; PrintBeads[]; -- BeadsDefs.PrintDes[@Des4,@Des5,@Des6]; BeadsDefs.CheckBeads[]; END; Replicate:PROCEDURE[hor:BOOLEAN]= BEGIN r:CARDINAL; --the number of replications s:CARDINAL; --the number of beads being replicated = topBead+1 i:CARDINAL; --a loop index bpi,bpiT:BeadPtr; r_IF hor THEN replicateH ELSE replicateV; IF r=1 THEN RETURN; UNTIL (r_r-1)=0 DO s_topBead+1; IF s+s-1>=noBead THEN Error; FindBoundingBox[]; FOR i IN [0..topBead] DO bpi_Get[i]; bpiT_Get[s+i]; bpiT^_bpi^; IF bpiT.beadR#noBead THEN bpiT.beadR_bpiT.beadR+s; IF bpiT.beadL#noBead THEN bpiT.beadL_bpiT.beadL+s; IF bpiT.beadU#noBead THEN bpiT.beadU_bpiT.beadU+s; IF bpiT.beadD#noBead THEN bpiT.beadD_bpiT.beadD+s; IF bpiT.beadT#noBead THEN bpiT.beadT_bpiT.beadT+s; IF hor THEN bpiT.x_bpiT.x+maxX ELSE bpiT.y_bpiT.y+maxY; ENDLOOP; FOR i IN [0..topBead] DO bpiT_Get[s+i]; IF hor AND bpiT.beadR#noBead THEN SELECT bpiT.t FROM endG,endB,endR=>SearchH[bpiT]; ENDCASE; IF ~hor AND bpiT.beadU#noBead THEN SELECT bpiT.t FROM endG,endB,endR=>SearchV[bpiT]; ENDCASE; ENDLOOP; topBead_s+s-1; FixWires[]; ENDLOOP; MakeCircuits[]; END; SearchH:PROCEDURE[bpi:BeadPtr]=BEGIN j:CARDINAL; FOR j IN [0..topBead] DO BEGIN bpj:BeadPtr_Get[j]; IF bpj.y=bpi.y AND bpj.t=bpi.t AND bpj.beadL#noBead THEN BEGIN left:CARDINAL_bpj.beadL; bpl:BeadPtr_Get[left]; wireRight:CARDINAL_bpi.beadR; bpwr:BeadPtr_Get[wireRight]; right:CARDINAL_bpwr.beadR; bpr:BeadPtr_Get[right]; IF left>=noBead OR right>=noBead OR wireRight>=noBead THEN Error; bpl.beadR_right; bpr.beadL_left; bpj.t_bpi.t_bpwr.t_none; RETURN; END; END; ENDLOOP; Error; END; SearchV:PROCEDURE[bpi:BeadPtr]=BEGIN j:CARDINAL; FOR j IN [0..topBead] DO BEGIN bpj:BeadPtr_Get[j]; IF bpj.x=bpi.x AND bpj.t=bpi.t AND bpj.beadD#noBead THEN BEGIN down:CARDINAL_bpj.beadD; bpd:BeadPtr_Get[down]; wireUp:CARDINAL_bpi.beadU; bpwu:BeadPtr_Get[wireUp]; up:CARDINAL_bpwu.beadU; bpu:BeadPtr_Get[up]; IF down>=noBead OR up>=noBead OR wireUp>=noBead THEN Error; bpd.beadU_up; bpu.beadD_down; bpj.t_bpi.t_bpwu.t_none; RETURN; END; END; ENDLOOP; Error; END; AskUser:PROCEDURE[s:STRING] RETURNS[BOOLEAN]= BEGIN RETURN[GetFirstChar[s]='y]; END; AskUserSize:PROCEDURE[s:STRING] RETURNS[CARDINAL]= BEGIN RETURN[SELECT GetFirstChar[s] FROM 'l=>900, 'm=>700, ENDCASE=>300]; END; GetFirstChar:PROCEDURE[s:STRING] RETURNS[char:CHARACTER]= BEGIN OPEN IODefs; WriteChar[CR]; WriteString[s]; WriteChar[char_ReadChar[]]; END; ReadInBeads:PROCEDURE= BEGIN OPEN StreamDefs; inputStream:DiskHandle; StringDefs.AppendString[fileName,".bead"]; inputStream_ NewWordStream[fileName,Read]; fileName.length_fileName.length-5; inputStream.reset[inputStream]; topBead_ ReadBlock[inputStream,InlineDefs.LowHalf[bead],noBead*16]/16- 1; inputStream.destroy[inputStream]; InitBeadWorking[]; END; WriteOutBeads:PROCEDURE= BEGIN OPEN StreamDefs; outputStream:DiskHandle; AskForFileName[" output file name= "]; StringDefs.AppendString[fileName,".bead"]; outputStream_ NewWordStream[fileName,Write+Append]; outputStream.reset[outputStream]; []_ WriteBlock[outputStream,InlineDefs.LowHalf[bead],(topBead+1)*16]; outputStream.destroy[outputStream]; END; AskForFileName:PROCEDURE[s:STRING]= BEGIN OPEN IODefs; i:CARDINAL; WriteChar[CR]; WriteString[s]; ReadID[fileName !Rubout=>RETRY]; FOR i IN [0..fileName.length) DO IF fileName[i]='. THEN BEGIN fileName.length_i; EXIT; END; ENDLOOP; END; PrintG:PROCEDURE=BEGIN FreeBelowNoodle[]; StringDefs.AppendString[fileName,".press"]; BeadsDefs.PrintGeometry[fileName]; fileName.length_fileName.length-6; AllocateBelowNoodle[]; END; PrintB:PROCEDURE=BEGIN t:BOOLEAN_debugBeads; debugBeads_TRUE; PrintBeads[]; debugBeads_t; END; ShowTime:PROCEDURE[s:STRING]= BEGIN oldTime:LONG CARDINAL_time; time_MiscDefs.CurrentTime[]; WriteOneNumber[s,InlineDefs.LowHalf[time-oldTime]]; END; -- ////// INITIALIZATION ////// AllocateBeadTable:PROCEDURE=BEGIN i:CARDINAL; bpi:BeadPtr; topBead_177777B; IF dMachine THEN bead_LOOPHOLE[1000000B] ELSE bead_SystemDefs.AllocateSegment[SIZE[Bead]*noBead]; FOR i IN [0..noBead] DO bpi_Get[i]; bpi.beadU_bpi.beadD_bpi.beadL_bpi.beadR_bpi.beadT_noBead; ENDLOOP; END; AllocateWorkTable:PROCEDURE=BEGIN IF dMachine THEN work_LOOPHOLE[1400000B] ELSE work_SystemDefs.AllocateSegment[SIZE[Work]*noBead]; IF ~dMachine THEN MiscDefs.Zero[InlineDefs.LowHalf[work],SIZE[Work]*noBead]; END; InitBeadWorking:PROCEDURE=INLINE BEGIN EnumerateBeads[InitBeadWork]; END; SortOnY:PROCEDURE=BEGIN i,j,si,sj:CARDINAL; yi,yj:INTEGER; bpsi,bpsj:BeadPtr; wpi,wpj:WorkPtr; FOR i IN [0..topBead) DO wpi_GetW[i]; si_wpi.sort; bpsi_Get[si]; yi_bpsi.y; FOR j IN (i..topBead] DO wpj_GetW[j]; sj_wpj.sort; bpsj_Get[sj]; yj_bpsj.y; IF yj>yi THEN BEGIN wpj.sort_si; si_wpi.sort_sj; yi_yj; END; ENDLOOP; ENDLOOP; END; -- //////Des TABLES ////// --DesRec:TYPE=REC[level,short,h:INTEGER,print:CHARACTER,toCode:INTEGER,etc des:ARRAY BeadType OF DesRec_[ --none:-- [4,0,00,'N,7], --all:-- [4,0,08,'A,6], --rg:-- [4,0,08,'R,5], --rb:-- [1,5,08,'B,3], --bg:-- [0,6,08,'G,4], --tt:-- [1,1,04,'t,7], --dd:-- [1,3,04,'d,7], --ttV:-- [1,2,04,'T,7], --ddV:-- [1,4,16,'D,7], --end:-- [0,6,04,'E,7], --endR:-- [1,5,04,'E,7], --endB:-- [2,7,06,'E,7], --stub:-- [4,0,00,'S,7], --jctn:-- [0,6,04,'g,0], --jctnR:--[1,5,04,'r,1], --jctnB:--[2,7,06,'b,2], --bf:-- [2,7,08,'F,7], --wireG:--[0,6,04,'W,7], --wireR:--[1,5,04,'w,7], --wireB:--[2,7,06,'W,7], --wireO:--[3,5,04,'O,8], --of:-- [3,5,04,'o,8] ]; --BeadType:TYPE=; --des[object].toWire is the distance from a green wire to the object; --des[object].h is the height of the object; --des[object].w is the width of the object; --des[object].wsR is the width of a horr wire coming out to the right of i --des[object].wsU is the width of a vert wire coming up out of i --short={empty,transH,transV,depH,depV,jctnR,jctnG,jctnB,contact} --Des4[i,j] is the vert spacing of i above j off wire; --Des5[i,j] is the vert spacing of i above j on wire; --Des6[i,j] is the horr spacing of i to the right of j off wire; LevelRec:TYPE=RECORD[toWire,toWireR,ws,lessLevel,bitPerLevel:INTEGER, blueOnly,rgOnly,rg:BOOLEAN,color:Color,rwc:BeadType]; LevelTable:ARRAY[0..5) OF LevelRec_[ [6,2,4,1,1,FALSE, TRUE, TRUE,g,wireG], [2,4,4,1,2,FALSE, TRUE,FALSE,r,wireR], [6,0,6,2,4, TRUE,FALSE, TRUE,b,wireB], [4,4,4,3,5,FALSE,FALSE,FALSE,o,wireO], [0,0,0,4,0,FALSE,FALSE,FALSE,none,none]]; SetDesTables:PROCEDURE=BEGIN-- zeros all mean never used i,j:CARDINAL; b,r:BeadType; l:INTEGER; FOR b IN BeadType DO l_des[b].level; des[b].rotate_b; des[b].stickOutToRight_0; des[b].trueIfTrans_FALSE; des[b].toWire_LevelTable[l].toWire; des[b].toWireR_LevelTable[l].toWireR; des[b].wsR_des[b].wsU_LevelTable[l].ws; des[b].lessLevel_LevelTable[l].lessLevel; des[b].bitPerLevel_LevelTable[l].bitPerLevel; des[b].color_LevelTable[l].color; des[b].rwc_LevelTable[l].rwc; ENDLOOP; des[ttV].stickOutToRight_3; des[ddV].stickOutToRight_2; des[tt].rwc_des[dd].rwc_wireG; des[tt].rg_des[dd].rg_TRUE; des[tt].rotate_ttV; des[dd].rotate_ddV; des[ttV].rotate_tt; des[ddV].rotate_dd; des[tt].trueIfTrans_des[dd].trueIfTrans _des[ttV].trueIfTrans_des[ddV].trueIfTrans_TRUE; des[tt].bitPerLevel_1; des[dd].bitPerLevel_1; FOR b IN BeadType DO r_des[b].rotate; des[b].w_des[r].h; des[b].ug_des[r].rg; des[b].bitPerLevelV_des[r].bitPerLevel; des[b].uwc_des[r].rwc; ENDLOOP; Des4_[ [ 0, 0, 0, 0, 0, 0, 0, 0], [ 0,10, 7, 9, 7, 7, 5, 0], [ 0, 7, 4, 6, 4, 4, 2, 0], [ 0, 9, 6, 8, 6, 6, 4, 0], [ 0, 7, 4, 6, 4, 4, 2, 0], [ 0, 7, 4, 6, 4, 4, 2, 0], [ 0, 5, 2, 4, 2, 2, 6, 0], [ 0, 0, 0, 0, 0, 0, 0, 6]]; Des5_[ [ 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 4, 4, 4, 4, 2, 2, 0],-- this is probably wrong [ 0, 4, 4, 4, 4, 2, 2, 0], [ 0, 4, 4, 4, 4, 2, 2, 0], [ 0, 4, 4, 4, 4, 2, 2, 0], [ 0, 2, 2, 2, 2,-4, 2, 0], [ 0, 2, 2, 2, 2, 2,-4, 0], [ 0, 0, 0, 0, 0, 0, 0,-6]]; FOR i IN [0..7] DO FOR j IN [0..7] DO Des6[i][j]_ Des4[Transpose[i]][Transpose[j]]; Des7[i][j]_ Des5[Transpose[i]][Transpose[j]]; ENDLOOP; ENDLOOP; END; Transpose:PROCEDURE[i:CARDINAL] RETURNS[CARDINAL]= INLINE BEGIN RETURN[SELECT i FROM 1 =>2, 2 =>1, 3 =>4, 4 =>3, ENDCASE =>i]; END; Main[]; END.. (1792)\8388i28I15i50I15i14I