annotate src/bv.tp @ 28:6384e577842d

Add code for filtering a program set based on the operators used
author Mike Pavone <pavone@retrodev.com>
date Sat, 10 Aug 2013 18:35:10 -0700
parents 655d5b19333d
children b00904b36aca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
1 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
2 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
3 program <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
4 _input <- 0u64
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
5 _acc <- 0u64
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
6 _val <- 0u64
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
7 _zero <- #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
8 string <- { "0" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
9 eval <- { 0u64 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
10 operators <- { 0 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
11 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
12 isTerminal? <- { true }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
15 _one <- #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
16 string <- { "1" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
17 eval <- { 1u64 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
18 operators <- { 0 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
19 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
20 isTerminal? <- { true }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
23 _inputNode <- #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
24 string <- { "input" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
25 eval <- { _input }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
26 operators <- { 0 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
27 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
28 isTerminal? <- { true }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
29 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
30 _accNode <- #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
31 string <- { "acc" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
32 eval <- { _acc }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
33 operators <- { 0 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
34 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
35 isTerminal? <- { true }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
36 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
37 _valNode <- #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
38 string <- { "val" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
39 eval <- { _val }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
40 operators <- { 0 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
41 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
42 isTerminal? <- { true }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
43 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
44 _opPlus <- 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
45 _opAnd <- 2
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
46 _opOr <- 4
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
47 _opXor <- 8
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
48 _opNot <- 0x10
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
49 _opShl1 <- 0x20
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
50 _opShr1 <- 0x40
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
51 _opShr4 <- 0x80
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
52 _opShr16 <- 0x100
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
53 _opIf0 <- 0x200
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
54 _opFold <- 0x400
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
55 _opTfold <- 0x800
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
56 _maskRemoveFold <- 0x3FF
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
57 _names <- dict linear
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
58 _names set: "plus" _opPlus
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
59 _names set: "and" _opAnd
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
60 _names set: "xor" _opXor
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
61 _names set: "or" _opOr
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
62 _names set: "not" _opNot
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
63 _names set: "shl1" _opShl1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
64 _names set: "shr1" _opShr1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
65 _names set: "shr4" _opShr4
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
66 _names set: "shr16" _opShr16
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
67 _names set: "if0" _opIf0
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
68 _names set: "fold" _opFold
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
69 _names set: "tfold" _opTfold
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
70 _memo <- #[]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
71 _memoFoldBody <- #[]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
72 _memoFoldParam <- #[]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
73 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
74 plus <- :left right {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
75 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
76 string <- { "(plus " . (string: left) . " " . (string: right) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
77 eval <- { (eval: left) + (eval: right)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
78 operators <- { _opPlus or (left operators) or (right operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
79 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
80 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
81 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
83 zero <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
84 _zero
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
85 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
86
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
87 one <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
88 _one
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
89 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
90
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
91 opAnd <- :left right {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
92 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
93 string <- { "(and " . (string: left) . " " . (string: right) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
94 eval <- { (eval: left) and (eval: right)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
95 operators <- { _opAnd or (left operators) or (right operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
96 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
97 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
98 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
99 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
100
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
101 opOr <- :left right {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
102 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
103 string <- { "(or " . (string: left) . " " . (string: right) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
104 eval <- { (eval: left) or (eval: right)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
105 operators <- { _opOr or (left operators) or (right operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
106 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
107 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
108 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
109 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
110
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
111 opXor <- :left right {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
112 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
113 string <- { "(xor " . (string: left) . " " . (string: right) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
114 eval <- { (eval: left) xor (eval: right)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
115 operators <- { _opXor or (left operators) or (right operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
116 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
117 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
118 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
119 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
120
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
121 opNot <- :exp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
122 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
123 string <- { "(not " . (string: exp) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
124 eval <- { (eval: exp) xor -1u64 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
125 operators <- { _opNot or (exp operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
126 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
127 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
128 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
129 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
130
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
131 shl1 <- :exp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
132 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
133 string <- { "(shl1 " . (string: exp) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
134 eval <- { lshift: (eval: exp) by: 1u64 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
135 operators <- { _opShl1 or (exp operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
136 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
137 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
138 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
139 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
140
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
141 shr1 <- :exp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
142 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
143 string <- { "(shr1 " . (string: exp) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
144 eval <- { rshift: (eval: exp) by: 1u64 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
145 operators <- { _opShr1 or (exp operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
146 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
147 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
148 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
149 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
150
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
151 shr4 <- :exp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
152 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
153 string <- { "(shr4 " . (string: exp) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
154 eval <- { rshift: (eval: exp) by: 4u64 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
155 operators <- { _opShr4 or (exp operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
156 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
157 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
158 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
159 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
160
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
161 shr16 <- :exp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
162 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
163 string <- { "(shr16 " . (string: exp) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
164 eval <- { rshift: (eval: exp) by: 16u64 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
165 operators <- { _opShr16 or (exp operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
166 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
167 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
168 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
169 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
170
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
171 input <- { _inputNode }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
172 acc <- { _accNode }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
173 val <- { _valNode }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
174
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
175 if0:then:else <- :exp ifzero :ifnotzero {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
176 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
177 string <- { "(if0 " . (string: exp) . " " . (string: ifzero) . " " . (string: ifnotzero) . ")" }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
178 eval <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
179 if: (eval: exp) = 0u64 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
180 eval: ifzero
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
181 } else: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
182 eval: ifnotzero
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
183 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
184 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
185 operators <- { _opIf0 or (exp operators) or (ifzero operators) or (ifnotzero operators)}
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
186 isTfold? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
187 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
188 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
189 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
190
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
191 fold:with:startingAt <- :toFold :fun :startAcc {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
192 #{
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
193 string <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
194 "(fold " . (string: toFold) . " " . (string: startAcc) . " (lambda (val acc) " . (string: fun) . "))"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
195 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
196 eval <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
197 _acc <- (eval: startAcc)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
198 source <- (eval: toFold)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
199 //parser doesn''t currently like vertical whitespace in arays so
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
200 //this needs to be on a single line until that bug is fixed
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
201 vals <- #[source and 255u64 (rshift: source by: 8u64) and 255u64 (rshift: source by: 16u64) and 255u64 (rshift: source by: 24u64) and 255u64 (rshift: source by: 32u64) and 255u64 (rshift: source by: 40u64) and 255u64 (rshift: source by: 48u64) and 255u64 (rshift: source by: 56u64) and 255u64]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
202 foreach: vals :idx cur {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
203 _val <- cur
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
204 _acc <- (eval: fun)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
205 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
206 _acc
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
207 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
208 operators <- { _opFold or (toFold operators) or (fun operators) or (startAcc operators) }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
209 isTfold? <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
210 (toFold isTerminal?) && (startAcc isTerminal?) && (toFold string) = "input" && (startAcc string) = "0"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
211 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
212 isTerminal? <- { false }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
213 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
214 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
215
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
216 run <- :in {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
217 _input <- in
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
218 eval: root
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
219 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
220
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
221 root <- _zero
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
222
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
223 string <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
224 "(lambda (input) " . (string: root) . ")"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
225 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
226
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
227 gentestprog <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
228 root <- if0: (opAnd: input one) then: (
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
229 plus: (opOr: input (shl1: one))
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
230 ) else: (
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
231 opXor: input (shr16: input)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
232 )
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
233 self
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
234 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
235
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
236 exampleprog <- {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
237 root <- fold: input with: (opOr: val acc) startingAt: zero
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
238 self
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
239 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
240
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
241 //TODO: memoize this to improve runtime for large n
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
242 allOfSize:inFold? <- :n :infold? {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
243 memo <- if: infold? = 2 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
244 _memoFoldBody
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
245 } else: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
246 if: infold? = 1 && n > 4 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
247 _memoFoldParam
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
248 } else: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
249 _memo
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
250 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
251 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
252 if: n - 1 < (memo length) {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
253 print: "Memo hit: " . (string: n) . "\n"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
254 memo get: (n - 1)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
255 } else: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
256 if: n = 1 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
257 res <- #[one zero input]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
258 if: infold? = 2 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
259 res append: acc
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
260 res append: val
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
261 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
262 print: "Saving at memo index: " . (string: (memo length)) . "\n"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
263 memo append: res
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
264 res
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
265 } else: {
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
266 res <- #[]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
267 foreach: (allOfSize: n - 1 inFold?: infold?) :idx exp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
268 res append: (opNot: exp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
269 res append: (shl1: exp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
270 res append: (shr1: exp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
271 res append: (shr4: exp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
272 res append: (shr16: exp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
273 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
274 if: n > 2 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
275 numLeft <- 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
276 argTotal <- n - 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
277 while: { numLeft < argTotal } do: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
278 numRight <- argTotal - numLeft
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
279 choicesRight <- (allOfSize: numRight inFold?: infold?)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
280 foreach: (allOfSize: numLeft inFold?: infold?) :idx leftExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
281 foreach: choicesRight :idx rightExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
282 res append: (opAnd: leftExp rightExp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
283 res append: (opOr: leftExp rightExp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
284 res append: (opXor: leftExp rightExp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
285 res append: (plus: leftExp rightExp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
286 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
287 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
288 numLeft <- numLeft + 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
289 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
290 if: n > 3 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
291 numLeft <- 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
292 limitLeft <- n - 2
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
293 while: { numLeft < limitLeft } do: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
294 numMid <- 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
295 limitMid <- n - (1 + numLeft)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
296 while: { numMid < limitMid } do: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
297 numRight <- n - (1 + numLeft + numMid)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
298 choicesRight <- (allOfSize: numRight inFold?: infold?)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
299 choicesMid <- (allOfSize: numMid inFold?: infold?)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
300 foreach: (allOfSize: numLeft inFold?: infold?) :idx leftExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
301 foreach: choicesMid :idx midExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
302 foreach: choicesRight :idx rightExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
303 res append: (if0: leftExp then: midExp else: rightExp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
304 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
305 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
306 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
307 numMid <- numMid + 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
308 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
309 numLeft <- numLeft + 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
310 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
311 if: n > 4 && infold? = 0 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
312 numSeq <- 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
313 limitSeq <- n - 3
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
314 while: { numSeq < limitSeq } do: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
315 numFun <- 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
316 limitFun <- n - (2 + numSeq)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
317 while: { numFun < limitFun } do: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
318 numStart <- n - (2 + numSeq + numFun)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
319 choicesStart <- (allOfSize: numStart inFold?: 1)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
320 choicesFun <- (allOfSize: numFun inFold?: 2)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
321 foreach: (allOfSize: numSeq inFold?: 1) :idx seqExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
322 foreach: choicesFun :idx funExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
323 foreach: choicesStart :idx startExp {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
324 res append: (fold: seqExp with: funExp startingAt: startExp)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
325 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
326 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
327 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
328 numFun <- numFun + 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
329 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
330 numSeq <- numSeq + 1
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
331 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
332 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
333 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
334 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
335 print: "Saving " . (string: n) . " at memo index: " . (string: (memo length)) . "\n"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
336 memo append: res
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
337 res
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
338 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
339 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
340 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
341
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
342 allOfSize <- :n {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
343 allOfSize: (n - 1) inFold?: 0
27
655d5b19333d Add memoization support to program generator
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
344 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
345
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
346 filterTrees <- :trees strops {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
347 filtered <- #[]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
348 ops <- strops fold: 0 with: :acc el {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
349 acc or (_names get: el withDefault: 0)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
350 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
351 if: (ops and _opTfold) > 0 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
352 foreach: trees :idx tree {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
353 if: (tree isTfold?) {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
354 if: (tree operators) and _maskRemoveFold = ops and _maskRemoveFold {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
355 filtered append: tree
9
0ccebdbc3e80 Add support for generating programs that contain fold. Make the desired program size a command line argument.
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
356 }
0ccebdbc3e80 Add support for generating programs that contain fold. Make the desired program size a command line argument.
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
357 }
8
3f0172ceab81 Add support for generating programs with if0, thus allowing us to generate all programs up to size 5.
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
358 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
359 } else: {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
360 foreach: trees :idx tree {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
361 if: (tree operators) = ops {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
362 filtered append: tree
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
363 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
364 }
7
301f16245955 Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
365 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
366 filtered
7
301f16245955 Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
367 }
301f16245955 Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
368 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
369 }
7
301f16245955 Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
370
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
371 test <- :prog {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
372 print: (string: prog) . "\n"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
373 print: "Operators: " . (hex: ((prog root) operators)) . "\n"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
374 if: ((prog root) isTfold?) {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
375 print: "TFold!\n"
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
376 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
377 //parser doesn''t currently like vertical whitespace in arays so
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
378 //this needs to be on a single line until that bug is fixed
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
379 vals <- #[0u64 1u64 2u64 3u64 4u64 5u64 6u64 7u64 8u64 9u64 10u64 11u64 12u64 13u64 14u64 15u64 0x30001u64 0x50015u64 (lshift: 0x11223344u64 by: 32u64) or 0x55667788u64]
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
380 foreach: vals :idx val {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
381 print: "p(0x" . (hex: val) . ") = 0x" . (hex: (prog run: val)) . "\n"
7
301f16245955 Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
382 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
383 }
28
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
384
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
385 main <- :args {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
386 //test: (program gentestprog)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
387 //test: (program exampleprog)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
388 size <- 3
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
389 if: (args length) > 1 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
390 size <- int32: (args get: 1)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
391 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
392 if: size >= 2 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
393 prog <- program
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
394 trees <- (prog allOfSize: size)
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
395 if: (args length) > 2 {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
396 ops <- (args get: 2) splitOn: ","
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
397 trees <- prog filterTrees: trees ops
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
398 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
399 foreach: trees :idx tree {
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
400 prog root! tree
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
401 test: prog
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
402 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
403 }
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
404 0
6384e577842d Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents: 27
diff changeset
405 }
3
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
406 }
dfc5f00c94bc Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
407 }