Better styling for miniImp
This commit is contained in:
@ -66,16 +66,27 @@ module RISCAssembly = struct
|
||||
let pp_risci (ppf: out_channel) (v: risci) : unit =
|
||||
let rec pp_risci (ppf: out_channel) (v: risci) : unit =
|
||||
match v with
|
||||
Nop -> Printf.fprintf ppf "\tNop\n"
|
||||
| BRegOp (b, r1, r2, r3) -> Printf.fprintf ppf "\t%a r%s r%s => r%s\n" pp_brop b r1.index r2.index r3.index
|
||||
| BImmOp (b, r1, i, r3) -> Printf.fprintf ppf "\t%a r%s %d => r%s\n" pp_biop b r1.index i r3.index
|
||||
| URegOp (u, r1, r2) -> Printf.fprintf ppf "\t%a r%s => r%s\n" pp_urop u r1.index r2.index
|
||||
| Load (r1, r2) -> Printf.fprintf ppf "\tLoad r%s => r%s\n" r1.index r2.index
|
||||
| LoadI (i, r2) -> Printf.fprintf ppf "\tLoadI %d => r%s\n" i r2.index
|
||||
| Store (r1, r2) -> Printf.fprintf ppf "\tStore r%s => r%s\n" r1.index r2.index
|
||||
| Jump (label) -> Printf.fprintf ppf "\tJump %s\n" label
|
||||
| CJump (r, l1, l2) -> Printf.fprintf ppf "\tCJump r%s => %s, %s\n" r.index l1 l2
|
||||
| Label (label) -> Printf.fprintf ppf "%s:" label
|
||||
| Nop ->
|
||||
Printf.fprintf ppf "\tNop\n"
|
||||
| BRegOp (b, r1, r2, r3) ->
|
||||
Printf.fprintf ppf "\t%a r%s r%s => r%s\n"
|
||||
pp_brop b r1.index r2.index r3.index
|
||||
| BImmOp (b, r1, i, r3) ->
|
||||
Printf.fprintf ppf "\t%a r%s %d => r%s\n" pp_biop b r1.index i r3.index
|
||||
| URegOp (u, r1, r2) ->
|
||||
Printf.fprintf ppf "\t%a r%s => r%s\n" pp_urop u r1.index r2.index
|
||||
| Load (r1, r2) ->
|
||||
Printf.fprintf ppf "\tLoad r%s => r%s\n" r1.index r2.index
|
||||
| LoadI (i, r2) ->
|
||||
Printf.fprintf ppf "\tLoadI %d => r%s\n" i r2.index
|
||||
| Store (r1, r2) ->
|
||||
Printf.fprintf ppf "\tStore r%s => r%s\n" r1.index r2.index
|
||||
| Jump (label) ->
|
||||
Printf.fprintf ppf "\tJump %s\n" label
|
||||
| CJump (r, l1, l2) ->
|
||||
Printf.fprintf ppf "\tCJump r%s => %s, %s\n" r.index l1 l2
|
||||
| Label (label) ->
|
||||
Printf.fprintf ppf "%s:" label
|
||||
and pp_brop (ppf: out_channel) (v: brop) : unit =
|
||||
match v with
|
||||
Add -> Printf.fprintf ppf "Add"
|
||||
@ -121,14 +132,18 @@ module RISCAssembly = struct
|
||||
| Some i -> Printf.fprintf ppf "Some %d\n" i );
|
||||
Printf.fprintf ppf "Input/Output Registers: ";
|
||||
( match t.inputoutputreg with
|
||||
None -> Printf.fprintf ppf "None\n"
|
||||
| Some (i, o) -> Printf.fprintf ppf "[i: Some r%s, o: Some r%s]\n" i.index o.index);
|
||||
| None ->
|
||||
Printf.fprintf ppf "None\n"
|
||||
| Some (i, o) ->
|
||||
Printf.fprintf ppf "[i: Some r%s, o: Some r%s]\n" i.index o.index);
|
||||
Printf.fprintf ppf "Code:\n";
|
||||
List.iter (pp_risci ppf) t.code
|
||||
end
|
||||
|
||||
let convert_cfgrisc_risci (i: CfgRISC.RISCSimpleStatements.t list) : (RISCAssembly.risci list) =
|
||||
let rec helper (i: CfgRISC.RISCSimpleStatements.t) : RISCAssembly.risci =
|
||||
let convert_cfgrisc_risci (i: CfgRISC.RISCSimpleStatements.t list) :
|
||||
(RISCAssembly.risci list) =
|
||||
let rec helper (i: CfgRISC.RISCSimpleStatements.t)
|
||||
: RISCAssembly.risci =
|
||||
match i with
|
||||
| Nop -> Nop
|
||||
| BRegOp (brop, r1, r2, r3) -> BRegOp (helper_brop brop,
|
||||
@ -148,7 +163,8 @@ let convert_cfgrisc_risci (i: CfgRISC.RISCSimpleStatements.t list) : (RISCAssemb
|
||||
{index = r3.index})
|
||||
| Store (r1, r3) -> Store ({index = r1.index},
|
||||
{index = r3.index})
|
||||
and helper_brop (brop: CfgRISC.RISCSimpleStatements.brop) : RISCAssembly.brop =
|
||||
and helper_brop (brop: CfgRISC.RISCSimpleStatements.brop)
|
||||
: RISCAssembly.brop =
|
||||
match brop with
|
||||
| Add -> Add
|
||||
| Sub -> Sub
|
||||
@ -163,7 +179,8 @@ let convert_cfgrisc_risci (i: CfgRISC.RISCSimpleStatements.t list) : (RISCAssemb
|
||||
| LessEq -> LessEq
|
||||
| More -> More
|
||||
| MoreEq -> MoreEq
|
||||
and helper_biop (biop: CfgRISC.RISCSimpleStatements.biop) : RISCAssembly.biop =
|
||||
and helper_biop (biop: CfgRISC.RISCSimpleStatements.biop)
|
||||
: RISCAssembly.biop =
|
||||
match biop with
|
||||
| AddI -> AddI
|
||||
| SubI -> SubI
|
||||
@ -178,7 +195,8 @@ let convert_cfgrisc_risci (i: CfgRISC.RISCSimpleStatements.t list) : (RISCAssemb
|
||||
| LessEqI -> LessEqI
|
||||
| MoreI -> MoreI
|
||||
| MoreEqI -> MoreEqI
|
||||
and helper_urop (urop: CfgRISC.RISCSimpleStatements.urop) : RISCAssembly.urop =
|
||||
and helper_urop (urop: CfgRISC.RISCSimpleStatements.urop)
|
||||
: RISCAssembly.urop =
|
||||
match urop with
|
||||
| Not -> Not
|
||||
| Copy -> Copy
|
||||
@ -186,7 +204,11 @@ let convert_cfgrisc_risci (i: CfgRISC.RISCSimpleStatements.t list) : (RISCAssemb
|
||||
in
|
||||
List.map helper i
|
||||
|
||||
let nextCommonSuccessor (prg: CfgRISC.RISCCfg.t) (node1: Cfg.Node.t) (node2: Cfg.Node.t) : Cfg.Node.t option =
|
||||
let nextCommonSuccessor
|
||||
(prg: CfgRISC.RISCCfg.t)
|
||||
(node1: Cfg.Node.t)
|
||||
(node2: Cfg.Node.t)
|
||||
: Cfg.Node.t option =
|
||||
(* Assume the two input nodes are the two branches of an if then else
|
||||
statement, then create the two lists that represent the runs until the
|
||||
terminal node by choosing always the false statement in guard statements
|
||||
@ -244,8 +266,12 @@ let rec helper
|
||||
let label2 = nextLabel () in
|
||||
let label3 = nextLabel () in
|
||||
|
||||
let res1, _ = (helper prg nextnode1 (currentnode :: nextnode2 :: alreadyVisited)) in
|
||||
let res2, vis2 = (helper prg nextnode2 (currentnode :: nextnode1 :: alreadyVisited)) in
|
||||
let res1, _ =
|
||||
(helper prg nextnode1
|
||||
(currentnode :: nextnode2 :: alreadyVisited)) in
|
||||
let res2, vis2 =
|
||||
(helper prg nextnode2
|
||||
(currentnode :: nextnode1 :: alreadyVisited)) in
|
||||
|
||||
match List.nth currentcode ((List.length currentcode) - 1) with
|
||||
| BRegOp (_, _, _, r)
|
||||
@ -253,11 +279,14 @@ let rec helper
|
||||
| URegOp (_, _, r)
|
||||
| Load (_, r)
|
||||
| Store (r, _)
|
||||
| LoadI (_, r) -> (([Label label1] : RISCAssembly.risci list) @
|
||||
| LoadI (_, r) -> (([Label label1]
|
||||
: RISCAssembly.risci list) @
|
||||
currentcode @
|
||||
([CJump (r, label2, label3); Label label2] : RISCAssembly.risci list) @
|
||||
([CJump (r, label2, label3); Label label2]
|
||||
: RISCAssembly.risci list) @
|
||||
res1 @
|
||||
([Jump label1; Label label3] : RISCAssembly.risci list) @
|
||||
([Jump label1; Label label3]
|
||||
: RISCAssembly.risci list) @
|
||||
res2
|
||||
, vis2)
|
||||
| _ -> failwith "Missing instruction at branch"
|
||||
@ -266,7 +295,8 @@ let rec helper
|
||||
let label2 = nextLabel () in
|
||||
let label3 = nextLabel () in
|
||||
|
||||
let res1, vis1 = (helper prg nextnode1 (currentnode :: ncs :: alreadyVisited)) in
|
||||
let res1, vis1 =
|
||||
(helper prg nextnode1 (currentnode :: ncs :: alreadyVisited)) in
|
||||
let res2, _ = (helper prg nextnode2 vis1) in
|
||||
let res3, vis3 = (helper prg ncs (currentnode :: alreadyVisited)) in
|
||||
match List.nth currentcode ((List.length currentcode) - 1) with
|
||||
@ -276,11 +306,14 @@ let rec helper
|
||||
| Load (_, r)
|
||||
| Store (r, _)
|
||||
| LoadI (_, r) -> (currentcode @
|
||||
([CJump (r, label1, label2); Label label1] : RISCAssembly.risci list) @
|
||||
([CJump (r, label1, label2); Label label1]
|
||||
: RISCAssembly.risci list) @
|
||||
res1 @
|
||||
([Jump label3; Label label2] : RISCAssembly.risci list) @
|
||||
([Jump label3; Label label2]
|
||||
: RISCAssembly.risci list) @
|
||||
res2 @
|
||||
([Label label3] : RISCAssembly.risci list) @
|
||||
([Label label3]
|
||||
: RISCAssembly.risci list) @
|
||||
res3
|
||||
, vis3)
|
||||
| _ -> failwith "Missing instruction at branch"
|
||||
|
||||
Reference in New Issue
Block a user