From 3a252a68796878d35d1264dfc520333efb3c8d62 Mon Sep 17 00:00:00 2001 From: Enrico Lumetti Date: Sun, 1 May 2022 22:52:32 +0200 Subject: [PATCH] Add CVar to bril translation --- cvar-to-bril.rkt | 50 +++++++++++++++++++++++++++++++++++++++++++ test-cvar-to-bril.rkt | 25 ++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 cvar-to-bril.rkt create mode 100644 test-cvar-to-bril.rkt diff --git a/cvar-to-bril.rkt b/cvar-to-bril.rkt new file mode 100644 index 0000000..dd1e3ed --- /dev/null +++ b/cvar-to-bril.rkt @@ -0,0 +1,50 @@ +#lang racket + +(provide cvar-to-bril) + +(require (prefix-in bril: bril/lang)) +(require "cvar.rkt") + +(define (cvar-to-bril program) + (match program + [(CProgram _ body) + (bril:Program (list + (bril:Function "main" '() '() + (apply append (map cvar-labeled-seq-to-bril body)))))])) + +(define (cvar-labeled-seq-to-bril labeled-seq) + (match labeled-seq + [(cons label seq) + (cons + (bril:Label (symbol->string label)) + (cvar-seq-to-bril seq))])) + +(define (cvar-seq-to-bril seq) + (match seq + [(Seq stmt tail) + (append + (cvar-stmt-to-bril stmt) + (cvar-seq-to-bril tail))] + [(Return var) + (list (bril:EffectInstr 'return (list (symbol->string (Var-name var))) + '() '()))])) + +(define (cvar-stmt-to-bril stmt) + (match stmt + [(Assign (Var varname) rhs) (generate-bril-instrs (symbol->string varname) rhs)])) + +(define (generate-bril-instrs dest expr) + (match expr + [(Int n) + (list (bril:ConstantInstr dest (bril:Type 'int) n))] + [(Prim '+ (list (Var v1) (Var v2))) + (list (bril:ValueInstr 'add dest (bril:Type 'int) + (list (symbol->string v1) + (symbol->string v2)) + '() '()))] + [(Prim '- (list (Var v1))) + (list (bril:ConstantInstr dest (bril:Type 'int) 0) + (bril:ValueInstr 'sub dest (bril:Type 'int) + (list dest + (symbol->string v1)) + '() '()))])) diff --git a/test-cvar-to-bril.rkt b/test-cvar-to-bril.rkt new file mode 100644 index 0000000..4033014 --- /dev/null +++ b/test-cvar-to-bril.rkt @@ -0,0 +1,25 @@ +#lang racket + +(require "test-util.rkt") +(require "cvar-to-bril.rkt") +(require "uniquify.rkt") +(require "remove-complex-oper.rkt") +(require "explicate-control.rkt") +(require "rvar.rkt") +(require bril/interpreter) + +(define listings + (list + (Program '() (Prim '+ (list (Int 1) (Int 2)))) + (Program '() (Prim '+ (list (Prim '- (list (Int 1))) (Int 2)))))) + +(define (evaluate-bril-main bril-program) + (cadr (interp-bril bril-program "main"))) + +(define (pass program) + (cvar-to-bril (explicate-control (remove-complex-opera*-2 (uniquify program))))) + +(for ([program listings]) + (test-eq (interp-RVar (list-ref listings 0)) + (evaluate-bril-main (pass (list-ref listings 0))))) +