<> <> <> DIRECTORY FS, PW, DPLib, IO, Rope, CDIO, BoolOps, TerminalIO; DPBuilder: CEDAR PROGRAM IMPORTS PW, DPLib, CDIO, FS, IO, Rope, BoolOps, TerminalIO = BEGIN OPEN DPLib; Generate: PW.UserProc = { <> myLib: PW.Design _ PW.OpenDesign["///Users/ross.pa/tamarin/datapath.dale"]; <<>> <> NUMBITS: INT = 32; <<>> <<>> <> <<>> <> <<>> ShiftGen: PROC [] RETURNS [shifter: PW.Object] = { shifter _ PW.AbutListY[LIST[sh31, sh30, sh29, sh28, sh27, sh26, sh25, sh24, PW.ArrayY[sh823, 16], sh7, sh6, sh5, sh4, sh3, sh2, sh1, sh0]]; shifter _ PW.AbutX[shifter, PW.AbutY[tagstuff31, tagstuff30, PW.ArrayY[tagstuff, NUMBITS-2]]]; RETURN[shifter]; }; CCodeGen: PROC [ccFile: Rope.ROPE] RETURNS [ccArray: PW.Object] = { BuildCCArray: PROC[in: IO.STREAM] RETURNS [ccArray: PW.Object] = { pterms: INT _ 0; r: Rope.ROPE; ccRow: PW.Object _ NIL; eof: BOOL _ FALSE; ccRowList: LIST OF PW.Object _ NIL; ccArrayList: LIST OF PW.Object _ NIL; numccRows: INT _ 0; DO r _ IO.GetLineRope[in ! IO.EndOfStream => {eof _ TRUE; CONTINUE}]; IF eof THEN EXIT; IF Rope.Length[r] < 1 THEN LOOP; <> ccRow _ NIL; ccRowList _ NIL; FOR j: INT IN [0..Rope.Length[r]) DO ch: CHAR _ Rope.Fetch[r, j]; IF PW.ODD[numccRows] THEN { SELECT ch FROM 'A => {ccRowList _ CONS[ccCellAL, ccRowList]}; 'B => {ccRowList _ CONS[ccCellBL, ccRowList]}; 'C => {ccRowList _ CONS[ccCellCL, ccRowList]}; 'D => {ccRowList _ CONS[ccCellDL, ccRowList]}; 'E => {ccRowList _ CONS[ccCellEL, ccRowList]}; 'F => {ccRowList _ CONS[ccCellFL, ccRowList]}; 'G => {ccRowList _ CONS[ccCellGL, ccRowList]}; 'H => {ccRowList _ CONS[ccCellHL, ccRowList]}; 'I => {ccRowList _ CONS[ccCellIL, ccRowList]}; 'J => {ccRowList _ CONS[ccCellJL, ccRowList]}; ENDCASE => { TerminalIO.WriteRope["Bad character in the input file ... \n"]; }; } ELSE { SELECT ch FROM 'A => {ccRowList _ CONS[ccCellAR, ccRowList]}; 'B => {ccRowList _ CONS[ccCellBR, ccRowList]}; 'C => {ccRowList _ CONS[ccCellCR, ccRowList]}; 'D => {ccRowList _ CONS[ccCellDR, ccRowList]}; 'E => {ccRowList _ CONS[ccCellER, ccRowList]}; 'F => {ccRowList _ CONS[ccCellFR, ccRowList]}; 'G => {ccRowList _ CONS[ccCellGR, ccRowList]}; 'H => {ccRowList _ CONS[ccCellHR, ccRowList]}; 'I => {ccRowList _ CONS[ccCellIR, ccRowList]}; 'J => {ccRowList _ CONS[ccCellJR, ccRowList]}; ENDCASE => { TerminalIO.WriteRope["Bad character in the input file ... \n"]; }; }; ENDLOOP; ccRow _ PW.AbutListY[PW.Reverse[ccRowList]]; ccArrayList _ CONS[ccRow, ccArrayList]; numccRows _ numccRows + 1; ENDLOOP; ccArray _ PW.AbutListX[ccArrayList]; RETURN[ccArray]; }; ccStream: IO.STREAM; explanation: Rope.ROPE; IF ccFile = NIL THEN RETURN[NIL]; ccStream _ FS.StreamOpen[fileName: ccFile, wDir: CDIO.GetWorkingDirectory[] ! FS.Error => IF error.group = user THEN {ccStream _ NIL; CONTINUE}]; IF ccStream = NIL THEN TerminalIO.WriteRope["Could not open input file \n"]; ccArray _ BuildCCArray[ccStream ! BoolOps.Error => {explanation _ msg; CONTINUE}]; IF explanation # NIL THEN TerminalIO.WriteRope["Bad character in the input file ... \n"]; RETURN[ccArray]; }; AdderGen: PROC [adderFile: Rope.ROPE] RETURNS [adder: PW.Object] = { BuildAdder: PROC[in: IO.STREAM] RETURNS [adder: PW.Object] = { pterms: INT _ 0; r: Rope.ROPE; addlist: LIST OF PW.Object; addcol: PW.Object _ NIL; eof: BOOL _ FALSE; DO r _ IO.GetLineRope[in ! IO.EndOfStream => {eof _ TRUE; CONTINUE}]; IF eof THEN EXIT; IF Rope.Length[r] < 1 THEN LOOP; FOR j: INT IN [0..Rope.Length[r]) DO ch: CHAR _ Rope.Fetch[r, j]; SELECT ch FROM 'B => {addlist _ CONS[cpAddB, addlist]}; 'R => {addlist _ CONS[cpAddR, addlist]}; ENDCASE => { TerminalIO.WriteRope["Bad character in the input file ... \n"]; }; ENDLOOP; addcol _ PW.AbutListY[addlist]; ENDLOOP; RETURN[addcol]; }; addStream: IO.STREAM; explanation: Rope.ROPE; IF adderFile = NIL THEN RETURN[NIL]; addStream _ FS.StreamOpen[fileName: adderFile, wDir: CDIO.GetWorkingDirectory[] ! FS.Error => IF error.group = user THEN {addStream _ NIL; CONTINUE}]; IF addStream = NIL THEN TerminalIO.WriteRope["Could not open input file \n"]; adder _ BuildAdder[addStream ! BoolOps.Error => {explanation _ msg; CONTINUE}]; IF explanation # NIL THEN TerminalIO.WriteRope["Bad character in the input file ... \n"]; RETURN[adder]; }; datapath: PW.Object; InitDP[myLib]; datapath _ PW.AbutX[PW.ArrayY[ dswap, NUMBITS], ShiftGen[], AdderGen["///users/ross.pa/tamarin/Adder.spec"], PW.ArrayY[lu2, NUMBITS], CCodeGen["///users/ross.pa/tamarin/CondCode.spec"]]; datapath _ PW.AbutX[PW.AbutY[msbside, datapath, lsbside], restOfDp]; <<>> RETURN[datapath]; }; PW.Register[Generate, "DPBuilder"]; END.