# HG changeset patch # User Mike Pavone # Date 1376024042 25200 # Node ID dfc5f00c94bc3c317ce4e9419db6b03b663a8cde # Parent 5cf8de487ed6a038807cf0a1787e62d97889c140 Initial evaluator implementation. fold is currently missing but other ops are present and seem to work diff -r 5cf8de487ed6 -r dfc5f00c94bc src/bv.tp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/bv.tp Thu Aug 08 21:54:02 2013 -0700 @@ -0,0 +1,138 @@ +#{ + program <- { + _input <- 0i64 + _zero <- #{ + string <- { "0" } + eval <- { 0i64 } + } + + _one <- #{ + string <- { "1" } + eval <- { 1i64 } + } + + _inputNode <- #{ + string <- { "input" } + eval <- { _input } + } + #{ + plus <- :left right { + #{ + string <- { "(plus " . (string: left) . " " . (string: right) . ")" } + eval <- { (eval: left) + (eval: right)} + } + } + zero <- { + _zero + } + + one <- { + _one + } + + opAnd <- :left right { + #{ + string <- { "(and " . (string: left) . " " . (string: right) . ")" } + eval <- { (eval: left) and (eval: right)} + } + } + + opOr <- :left right { + #{ + string <- { "(or " . (string: left) . " " . (string: right) . ")" } + eval <- { (eval: left) or (eval: right)} + } + } + + opXor <- :left right { + #{ + string <- { "(xor " . (string: left) . " " . (string: right) . ")" } + eval <- { (eval: left) xor (eval: right)} + } + } + + opNot <- :exp { + #{ + string <- { "(not " . (string: exp) . ")" } + eval <- { (eval: exp) xor -1 } + } + } + + shl1 <- :exp { + #{ + string <- { "(shl1 " . (string: exp) . ")" } + eval <- { lshift: (eval: exp) by: 1 } + } + } + + shr1 <- :exp { + #{ + string <- { "(shr1 " . (string: exp) . ")" } + eval <- { rshift: (eval: exp) by: 1 } + } + } + + shr4 <- :exp { + #{ + string <- { "(shr4 " . (string: exp) . ")" } + eval <- { rshift: (eval: exp) by: 4 } + } + } + + shr16 <- :exp { + #{ + string <- { "(shr16 " . (string: exp) . ")" } + eval <- { rshift: (eval: exp) by: 16 } + } + } + + input <- { _inputNode } + + if0:then:else <- :exp ifzero :ifnotzero { + #{ + string <- { "(if0 " . (string: exp) . " " . (string: ifzero) . " " . (string: ifnotzero) . ")" } + eval <- { + if: (eval: exp) = 0i64 { + eval: ifzero + } else: { + eval: ifnotzero + } + } + } + } + + run <- :in { + _input <- in + eval: root + } + + root <- _zero + + string <- { + "(lambda (input) " . (string: root) . ")" + } + + gentestprog <- { + root <- if0: (opAnd: input one) then: ( + plus: (opOr: input (shl1: one)) + ) else: ( + opXor: input (shr16: input) + ) + self + } + } + } + + test <- { + prog <- program gentestprog + print: (string: prog) . "\n" + vals <- #[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0x30001 0x50015] + foreach: vals :idx val { + print: "p(0x" . (hex: val) . ") = 0x" . (hex: (prog run: val)) . "\n" + } + } + + main <- { + test: + } +}