[/] [trunk/] [src/] [mcs51/] [maketimed.sml] - Diff 20 ⟶ 43

Diff between revs 20 and 43
Rev 20 Rev 43
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)