<> <> <> <<>> <<>> DIRECTORY Convert, FS, IO, MonkeyHeart, Rope; MicroCodeBuilder: CEDAR PROGRAM IMPORTS Convert, FS, IO, Rope = BEGIN OPEN MonkeyHeart; BadInputLineLength: SIGNAL [shouldBe, actualLength: INT] = CODE; BadInputChar: SIGNAL [badChar: CHAR] = CODE; GetAndSetUpFile: PROC [fileName: Rope.ROPE] RETURNS [inputStream: FS.STREAM, inputFile: FS.OpenFile] ~ { inputFile _ FS.Open[fileName]; inputStream _ FS.StreamFromOpenFile[inputFile]; RETURN [inputStream, inputFile]; }; ReadMicroInstruction: PROC [inputStream: FS.STREAM] RETURNS [mi: MicroInstruction] ~ { inputLine: Rope.ROPE; lineLength: INT; number: NAT; inputLine _ IO.GetLineRope[inputStream]; lineLength _ Rope.Length[inputLine]; IF lineLength # microCodeWidth THEN SIGNAL BadInputLineLength[microCodeWidth, lineLength]; <> number _ Convert.IntFromRope[Rope.Substr[inputLine, readCxtPos, readCxtLen], 2]; mi.readCxt _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, writeCxtPos, writeCxtLen], 2]; mi.writeCxt _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, newTopCxtPos, newTopCxtLen], 2]; mi.newTopCxt _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, newBotCxtPos, newBotCxtLen], 2]; mi.newBotCxt _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, altCxtPos, altCxtLen], 2]; mi.altCxt _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, memOpPos, memOpLen], 2]; mi.memOp _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, tagPos, tagLen], 2]; mi.tag _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, euOpPos, euOpLen], 2]; mi.euOp _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, rd1AddrPos, rd1AddrLen], 2]; mi.rd1Addr _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, rd2AddrPos, rd2AddrLen], 2]; mi.rd2Addr _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, dswapPos, dswapLen], 2]; mi.dswap _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, rAddrPos, rAddrLen], 2]; mi.rAddr _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, waddrPos, waddrLen], 2]; mi.waddr _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, newargPos, newargLen], 2]; mi.newarg _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, newarg2Pos, newarg2Len], 2]; mi.newarg2 _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, newtosPos, newtosLen], 2]; mi.newtos _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, muxreadPos, muxreadLen], 2]; mi.muxread _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, muxwritePos, muxwriteLen], 2]; mi.muxwrite _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, tosPrimePos, tosPrimeLen], 2]; mi.tosPrime _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, argPrimePos, argPrimeLen], 2]; mi.argPrime _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, arg2PrimePos, arg2PrimeLen], 2]; mi.arg2Prime _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, kPos, kLen], 2]; mi.k _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, invertCCodePos, invertCCodeLen], 2]; mi.invertCCode _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, dpCCodePos, dpCCodeLen], 2]; mi.dpCCode _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, muxCCodePos, muxCCodeLen], 2]; mi.muxCCode _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, resultCCodePos, resultCCodeLen], 2]; mi.resultCCode _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, memCCodePos, memCCodeLen], 2]; mi.memCCode _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, writeOnTruePos, writeOnTrueLen], 2]; mi.writeOnTrue _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, nextInstAPos, nextInstALen], 2]; mi.nextInstA _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, nextInstBPos, nextInstBLen], 2]; mi.nextInstB _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, miscPos, miscLen], 2]; mi.misc _ LOOPHOLE[number, NAT]; number _ Convert.IntFromRope[Rope.Substr[inputLine, updatePCPos, updatePCLen], 2]; mi.updatePC _ LOOPHOLE[number, BOOL]; number _ Convert.IntFromRope[Rope.Substr[inputLine, opLengthPos, opLengthLen], 2]; mi.opLength _ LOOPHOLE[number, NAT]; RETURN [mi]; }; BuildMicroCodeArray: PROC [filename: Rope.ROPE] RETURNS [miArray: MicroCodeRep] ~ { inputStream: FS.STREAM; inputFile: FS.OpenFile; inputLine: Rope.ROPE; [inputStream, inputFile] _ GetAndSetUpFile[filename]; inputLine _ IO.GetLineRope[inputStream]; -- gets rid of initial junk FOR i: NAT IN [0..microCodeHeight) DO miArray[i] _ ReadMicroInstruction[inputStream]; ENDLOOP; [] _ IO.Close[inputStream]; RETURN[miArray]; }; GetMicroInstruction: PROC [miArray: MicroCode, entry: NAT] RETURNS [mi: MicroInstruction] ~ { mi _ miArray[entry]; RETURN[mi]; }; END.