| Line 17... |
Line 17... |
val nmIRAM = `"IRAM"
|
val nmIRAM = `"IRAM"
|
val nmERAM = `"ERAM"
|
val nmERAM = `"ERAM"
|
val nmBITS = `"BITS"
|
val nmBITS = `"BITS"
|
val nmR = Vector.tabulate (8, (fn i=> `("R"^Int.toString i)))
|
val nmR = Vector.tabulate (8, (fn i=> `("R"^Int.toString i)))
|
|
|
val cycleConst = E.VarExpr (E.SimpleVar (nmCycleConst, E.nopos))
|
val cycleConst = E.VarExpr (E.SimpleVar nmCycleConst)
|
val cycleClk = E.VarExpr (E.SimpleVar (nmCycleClk, E.nopos))
|
val cycleClk = E.VarExpr (E.SimpleVar nmCycleClk)
|
|
|
val one = E.IntCExpr 1
|
val one = E.IntCExpr 1
|
val zero = E.IntCExpr 0
|
val zero = E.IntCExpr 0
|
val maxbyte = E.IntCExpr 255
|
val maxbyte = E.IntCExpr 255
|
|
|
local
|
local
|
fun makeVar s = E.VarExpr (E.SimpleVar (Atom.atom s, E.nopos))
|
fun makeVar s = E.VarExpr (E.SimpleVar (Atom.atom s))
|
val accum = E.VarExpr (E.SimpleVar (nmAccum, E.nopos))
|
val accum = E.VarExpr (E.SimpleVar nmAccum)
|
val carry = E.VarExpr (E.SimpleVar (nmCarry, E.nopos))
|
val carry = E.VarExpr (E.SimpleVar nmCarry)
|
val iram = E.SimpleVar (nmIRAM, E.nopos)
|
val iram = E.SimpleVar nmIRAM
|
val eram = E.SimpleVar (nmERAM, E.nopos)
|
val eram = E.SimpleVar nmERAM
|
val bits = E.SimpleVar (nmBITS, E.nopos)
|
val bits = E.SimpleVar nmBITS
|
|
|
fun regToAtom ASM.R0 = Vector.sub (nmR, 0)
|
fun regToAtom ASM.R0 = Vector.sub (nmR, 0)
|
| regToAtom ASM.R1 = Vector.sub (nmR, 1)
|
| regToAtom ASM.R1 = Vector.sub (nmR, 1)
|
| regToAtom ASM.R2 = Vector.sub (nmR, 2)
|
| regToAtom ASM.R2 = Vector.sub (nmR, 2)
|
| regToAtom ASM.R3 = Vector.sub (nmR, 3)
|
| regToAtom ASM.R3 = Vector.sub (nmR, 3)
|
| regToAtom ASM.R4 = Vector.sub (nmR, 4)
|
| regToAtom ASM.R4 = Vector.sub (nmR, 4)
|
| regToAtom ASM.R5 = Vector.sub (nmR, 5)
|
| regToAtom ASM.R5 = Vector.sub (nmR, 5)
|
| regToAtom ASM.R6 = Vector.sub (nmR, 6)
|
| regToAtom ASM.R6 = Vector.sub (nmR, 6)
|
| regToAtom ASM.R7 = Vector.sub (nmR, 7)
|
| regToAtom ASM.R7 = Vector.sub (nmR, 7)
|
|
|
fun regToVar r = E.VarExpr (E.SimpleVar (regToAtom r, E.nopos))
|
fun regToVar r = E.VarExpr (E.SimpleVar (regToAtom r))
|
fun subscriptVar (v,idxex) = E.VarExpr (E.SubscriptVar(v, idxex, E.nopos))
|
fun subscriptVar (v,idxex) = E.VarExpr (E.SubscriptVar (v, idxex))
|
fun directToVar d = subscriptVar (iram, makeVar (ASM.directToString d))
|
fun directToVar d = subscriptVar (iram, makeVar (ASM.directToString d))
|
fun indirectToVar r = subscriptVar (iram, makeVar (ASM.indToString r))
|
fun indirectToVar r = subscriptVar (iram, makeVar (ASM.indToString r))
|
fun immToVar r = makeVar (ASM.dataToString r)
|
fun immToVar r = makeVar (ASM.dataToString r)
|
fun bitToVar b = subscriptVar (bits, makeVar (ASM.bitToString b))
|
fun bitToVar b = subscriptVar (bits, makeVar (ASM.bitToString b))
|
|
|
fun assign (s,v,a) = [E.AssignExpr{var=s,aop=a,expr=v,pos=E.nopos}]
|
fun assign (s,v,a) = [E.AssignExpr {var=s, aop=a, expr=v}]
|
in
|
in
|
fun addReset act = act @ assign (cycleClk, zero, E.AssignOp)
|
fun addReset act = act @ assign (cycleClk, zero, E.AssignOp)
|
|
|
fun makeAction (ASM.ADD_reg r) = assign(accum,regToVar r,E.PlusEqOp)(*{{{1*)
|
fun makeAction (ASM.ADD_reg r) = assign(accum,regToVar r,E.PlusEqOp)(*{{{1*)
|
| makeAction (ASM.ADD_dir d) = assign (accum, directToVar d, E.PlusEqOp)
|
| makeAction (ASM.ADD_dir d) = assign (accum, directToVar d, E.PlusEqOp)
|
| Line 218... |
Line 218... |
| jumpsTo (ASM.SJMP r) = SOME (ASM.relToString r)
|
| jumpsTo (ASM.SJMP r) = SOME (ASM.relToString r)
|
| jumpsTo (ASM.JMP_DPTR) = NONE
|
| jumpsTo (ASM.JMP_DPTR) = NONE
|
| jumpsTo _ = NONE
|
| jumpsTo _ = NONE
|
|
|
fun guardCmp (l, cmp, r, dst) = let
|
fun guardCmp (l, cmp, r, dst) = let
|
val g = E.RelExpr {left=l, rel=cmp, right=r, pos=E.nopos}
|
val g = E.RelExpr {left=l, rel=cmp, right=r}
|
in SOME (g, ASM.relToString dst) end
|
in SOME (g, ASM.relToString dst) end
|
|
|
(* For jump expressions: returns a guard and label pair, the former
|
(* For jump expressions: returns a guard and label pair, the former
|
* guarding a transition to the latter. *)
|
* guarding a transition to the latter. *)
|
fun jumpGuard (ASM.JZ rel) = guardCmp (accum, E.EqOp, zero, rel)
|
fun jumpGuard (ASM.JZ rel) = guardCmp (accum, E.EqOp, zero, rel)
|
| Line 241... |
Line 241... |
| jumpGuard (ASM.DJNZ_reg (r,rel)) = guardCmp (regToVar r, E.NeOp, one, rel)
|
| jumpGuard (ASM.DJNZ_reg (r,rel)) = guardCmp (regToVar r, E.NeOp, one, rel)
|
| jumpGuard (ASM.DJNZ_dir (d,rel)) = guardCmp (directToVar d,E.NeOp,one,rel)
|
| jumpGuard (ASM.DJNZ_dir (d,rel)) = guardCmp (directToVar d,E.NeOp,one,rel)
|
| jumpGuard _ = NONE
|
| jumpGuard _ = NONE
|
|
|
fun seqGuard (ASM.DJNZ_reg (r,rel)) =SOME (E.RelExpr {left=regToVar r,
|
fun seqGuard (ASM.DJNZ_reg (r,rel)) =SOME (E.RelExpr {left=regToVar r,
|
rel=E.EqOp, right=one, pos=E.nopos})
|
rel=E.EqOp, right=one})
|
| seqGuard (ASM.DJNZ_dir (d,rel)) =SOME (E.RelExpr {left=directToVar d,
|
| seqGuard (ASM.DJNZ_dir (d,rel)) =SOME (E.RelExpr {left=directToVar d,
|
rel=E.EqOp, right=one, pos=E.nopos})
|
rel=E.EqOp, right=one})
|
| seqGuard act = Option.map (fn (jg,_)=>E.negate jg) (jumpGuard act)
|
| seqGuard act = Option.map (fn (jg,_)=>E.negate jg) (jumpGuard act)
|
|
|
local
|
local
|
val byte = E.INT (SOME (zero, maxbyte), E.NoQual)
|
val byte = E.INT (SOME (zero, maxbyte), E.NoQual)
|
fun mkArray (n, ty) = E.ARRAY (ty,E.Type (E.INT
|
fun mkArray (n, ty) = E.ARRAY (ty,E.Type (E.INT
|
(SOME (zero, E.IntCExpr (n - 1)),
|
(SOME (zero, E.IntCExpr (n - 1)),
|
E.NoQual)))
|
E.NoQual)))
|
fun mkReg (r, rs) = (r, D.VarDecl {id=r, ty=byte,
|
fun mkReg (r, rs) = (r, D.VarDecl {id=r, ty=byte, pos=D.nopos,
|
initial=SOME (D.SimpleInit zero),
|
initial=SOME (D.SimpleInit zero)}) :: rs
|
pos=E.nopos}) :: rs
|
|
|
|
val varMap = foldl AtomMap.insert' AtomMap.empty (
|
val varMap = foldl AtomMap.insert' AtomMap.empty (
|
(nmCycleConst,D.VarDecl {id=nmCycleConst, ty=E.INT (NONE, E.Const),
|
(nmCycleConst,D.VarDecl {id=nmCycleConst, ty=E.INT (NONE, E.Const),
|
initial=NONE, pos=E.nopos})::
|
initial=NONE, pos=D.nopos})::
|
(nmCycleClk, D.VarDecl {id=nmCycleClk, ty=E.CLOCK,
|
(nmCycleClk, D.VarDecl {id=nmCycleClk, ty=E.CLOCK, initial=NONE,
|
initial=NONE, pos=E.nopos})::
|
pos=D.nopos})::
|
(nmAccum, D.VarDecl {id=nmAccum, ty=byte,
|
(nmAccum, D.VarDecl {id=nmAccum, ty=byte, pos=D.nopos,
|
initial=SOME (D.SimpleInit zero), pos=E.nopos})::
|
initial=SOME (D.SimpleInit zero)})::
|
(nmCarry, D.VarDecl {id=nmAccum, ty=E.BOOL E.NoQual,
|
(nmCarry, D.VarDecl {id=nmAccum, ty=E.BOOL E.NoQual, pos=D.nopos,
|
initial=SOME (D.SimpleInit E.falseExpr),
|
initial=SOME (D.SimpleInit E.falseExpr)})::
|
pos=E.nopos})::
|
|
(nmIRAM, D.VarDecl {id=nmIRAM, ty=mkArray (128, byte),
|
(nmIRAM, D.VarDecl {id=nmIRAM, ty=mkArray (128, byte),
|
initial=NONE, pos=E.nopos})::
|
initial=NONE, pos=D.nopos})::
|
(nmERAM, D.VarDecl {id=nmERAM, ty=mkArray (10, byte),
|
(nmERAM, D.VarDecl {id=nmERAM, ty=mkArray (10,byte), initial=NONE,
|
initial=NONE, pos=E.nopos})::
|
pos=D.nopos})::
|
(nmBITS, D.VarDecl {id=nmBITS, ty=mkArray (128, E.BOOL E.NoQual),
|
(nmBITS, D.VarDecl {id=nmBITS, ty=mkArray (128, E.BOOL E.NoQual),
|
initial=NONE, pos=E.nopos})::
|
initial=NONE, pos=D.nopos})::
|
Vector.foldl mkReg [] nmR)
|
Vector.foldl mkReg [] nmR)
|
in
|
in
|
fun varToDecl nm = AtomMap.find (varMap, nm)
|
fun varToDecl nm = AtomMap.find (varMap, nm)
|
end
|
end
|
|
|
| Line 292... |
Line 290... |
in
|
in
|
fun actionConstraint (a, rel) = let
|
fun actionConstraint (a, rel) = let
|
val nc = ASM.numCycles a
|
val nc = ASM.numCycles a
|
val t = if nc = 1 then cycleConst
|
val t = if nc = 1 then cycleConst
|
else E.BinIntExpr {left=E.IntCExpr nc, bop=E.TimesOp,
|
else E.BinIntExpr {left=E.IntCExpr nc, bop=E.TimesOp,
|
right=cycleConst, pos=E.nopos}
|
right=cycleConst}
|
in E.RelExpr {left=cycleClk, rel=rel, right=t, pos=E.nopos} end
|
in E.RelExpr {left=cycleClk, rel=rel, right=t} end
|
|
|
fun makeTimed ([], _) = P.Template.new ("", NONE)
|
fun makeTimed ([], _) = P.Template.new ("", NONE)
|
| makeTimed (instrs, {showinstrs, position, maxrows}) = let
|
| makeTimed (instrs, {showinstrs, position, maxrows}) = let
|
|
|
local val (currx, curry, n) = (ref 0, ref 0, ref 0)
|
local val (currx, curry, n) = (ref 0, ref 0, ref 0)
|
local val (currx, curry, n) = (ref 0, ref 0, ref 0)
|
local val (currx, curry, n) = (ref 0, ref 0, ref 0)
|