about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-02-19 16:32:00 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-02-19 16:32:05 -0800
commitc1a50c82b85825c07b58ce5e4f3a1d5433cae5dd (patch)
treeb80292093b7743eade48187c130e6f7aa05004bc
parent79a7ad4f8c67f7de7d2e478aa7c62d39f8f62f6f (diff)
downloadmu-c1a50c82b85825c07b58ce5e4f3a1d5433cae5dd.tar.gz
787 - arithmetic operations
Lots of duplication here; we'll clean it up later.
-rw-r--r--cpp/.traces/add23
-rw-r--r--cpp/.traces/add_literal9
-rw-r--r--cpp/.traces/copy13
-rw-r--r--cpp/.traces/divide24
-rw-r--r--cpp/.traces/divide_literal10
-rw-r--r--cpp/.traces/divide_with_remainder26
-rw-r--r--cpp/.traces/divide_with_remainder_literal12
-rw-r--r--cpp/.traces/multiply24
-rw-r--r--cpp/.traces/multiply_literal10
-rw-r--r--cpp/.traces/subtract23
-rw-r--r--cpp/.traces/subtract_literal9
-rw-r--r--cpp/010vm8
-rw-r--r--cpp/012run206
13 files changed, 391 insertions, 6 deletions
diff --git a/cpp/.traces/add b/cpp/.traces/add
new file mode 100644
index 00000000..365c75f0
--- /dev/null
+++ b/cpp/.traces/add
@@ -0,0 +1,23 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "23", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "34", type: 0}
+parse/0:   product: {name: "2", type: 1}
+parse/0: instruction: 2
+parse/0:   ingredient: {name: "1", type: 1}
+parse/0:   ingredient: {name: "2", type: 1}
+parse/0:   product: {name: "3", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 23
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 34
+mem/0: storing in location 2
+run/0: instruction 2
+run/0: ingredient 0 is 1
+mem/0: location 1 is 23
+run/0: ingredient 1 is 2
+mem/0: location 2 is 34
+run/0: product 0 is 57
+mem/0: storing in location 3
diff --git a/cpp/.traces/add_literal b/cpp/.traces/add_literal
new file mode 100644
index 00000000..fcbb611f
--- /dev/null
+++ b/cpp/.traces/add_literal
@@ -0,0 +1,9 @@
+parse/0: instruction: 2
+parse/0:   ingredient: {name: "23", type: 0}
+parse/0:   ingredient: {name: "34", type: 0}
+parse/0:   product: {name: "1", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 23
+run/0: ingredient 1 is 34
+run/0: product 0 is 57
+mem/0: storing in location 1
diff --git a/cpp/.traces/copy b/cpp/.traces/copy
new file mode 100644
index 00000000..965b5f2a
--- /dev/null
+++ b/cpp/.traces/copy
@@ -0,0 +1,13 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "23", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1", type: 1}
+parse/0:   product: {name: "2", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 23
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 1
+mem/0: location 1 is 23
+mem/0: storing in location 2
diff --git a/cpp/.traces/divide b/cpp/.traces/divide
new file mode 100644
index 00000000..d713a512
--- /dev/null
+++ b/cpp/.traces/divide
@@ -0,0 +1,24 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "27", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "3", type: 0}
+parse/0:   product: {name: "2", type: 1}
+parse/0: instruction: 5
+parse/0:   ingredient: {name: "1", type: 1}
+parse/0:   ingredient: {name: "2", type: 1}
+parse/0:   product: {name: "3", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 27
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 3
+mem/0: storing in location 2
+run/0: instruction 2
+run/0: ingredient 0 is 1
+mem/0: location 1 is 27
+run/0: ingredient 1 is 2
+mem/0: location 2 is 3
+run/0: ingredient 1 is 3
+run/0: product 0 is 9
+mem/0: storing in location 3
diff --git a/cpp/.traces/divide_literal b/cpp/.traces/divide_literal
new file mode 100644
index 00000000..47f8690f
--- /dev/null
+++ b/cpp/.traces/divide_literal
@@ -0,0 +1,10 @@
+parse/0: instruction: 5
+parse/0:   ingredient: {name: "8", type: 0}
+parse/0:   ingredient: {name: "2", type: 0}
+parse/0:   product: {name: "1", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 8
+run/0: ingredient 1 is 2
+run/0: ingredient 1 is 2
+run/0: product 0 is 4
+mem/0: storing in location 1
diff --git a/cpp/.traces/divide_with_remainder b/cpp/.traces/divide_with_remainder
new file mode 100644
index 00000000..330141db
--- /dev/null
+++ b/cpp/.traces/divide_with_remainder
@@ -0,0 +1,26 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "27", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "11", type: 0}
+parse/0:   product: {name: "2", type: 1}
+parse/0: instruction: 6
+parse/0:   ingredient: {name: "1", type: 1}
+parse/0:   ingredient: {name: "2", type: 1}
+parse/0:   product: {name: "3", type: 1}
+parse/0:   product: {name: "4", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 27
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 11
+mem/0: storing in location 2
+run/0: instruction 2
+run/0: ingredient 0 is 1
+mem/0: location 1 is 27
+run/0: ingredient 1 is 2
+mem/0: location 2 is 11
+run/0: product 0 is 2
+mem/0: storing in location 3
+run/0: product 1 is 5
+mem/0: storing in location 4
diff --git a/cpp/.traces/divide_with_remainder_literal b/cpp/.traces/divide_with_remainder_literal
new file mode 100644
index 00000000..aa3b6478
--- /dev/null
+++ b/cpp/.traces/divide_with_remainder_literal
@@ -0,0 +1,12 @@
+parse/0: instruction: 6
+parse/0:   ingredient: {name: "9", type: 0}
+parse/0:   ingredient: {name: "2", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0:   product: {name: "2", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 9
+run/0: ingredient 1 is 2
+run/0: product 0 is 4
+mem/0: storing in location 1
+run/0: product 1 is 1
+mem/0: storing in location 2
diff --git a/cpp/.traces/multiply b/cpp/.traces/multiply
new file mode 100644
index 00000000..4d9c5008
--- /dev/null
+++ b/cpp/.traces/multiply
@@ -0,0 +1,24 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "4", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "6", type: 0}
+parse/0:   product: {name: "2", type: 1}
+parse/0: instruction: 4
+parse/0:   ingredient: {name: "1", type: 1}
+parse/0:   ingredient: {name: "2", type: 1}
+parse/0:   product: {name: "3", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 4
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 6
+mem/0: storing in location 2
+run/0: instruction 2
+run/0: ingredient 0 is 1
+mem/0: location 1 is 4
+run/0: ingredient 1 is 2
+mem/0: location 2 is 6
+run/0: ingredient 1 is 6
+run/0: product 0 is 24
+mem/0: storing in location 3
diff --git a/cpp/.traces/multiply_literal b/cpp/.traces/multiply_literal
new file mode 100644
index 00000000..e27a4fa9
--- /dev/null
+++ b/cpp/.traces/multiply_literal
@@ -0,0 +1,10 @@
+parse/0: instruction: 4
+parse/0:   ingredient: {name: "2", type: 0}
+parse/0:   ingredient: {name: "3", type: 0}
+parse/0:   product: {name: "1", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 2
+run/0: ingredient 1 is 3
+run/0: ingredient 1 is 3
+run/0: product 0 is 6
+mem/0: storing in location 1
diff --git a/cpp/.traces/subtract b/cpp/.traces/subtract
new file mode 100644
index 00000000..73b675e9
--- /dev/null
+++ b/cpp/.traces/subtract
@@ -0,0 +1,23 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "23", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "34", type: 0}
+parse/0:   product: {name: "2", type: 1}
+parse/0: instruction: 3
+parse/0:   ingredient: {name: "1", type: 1}
+parse/0:   ingredient: {name: "2", type: 1}
+parse/0:   product: {name: "3", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 23
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 34
+mem/0: storing in location 2
+run/0: instruction 2
+run/0: ingredient 0 is 1
+mem/0: location 1 is 23
+run/0: ingredient 1 is 2
+mem/0: location 2 is 34
+run/0: product 0 is -11
+mem/0: storing in location 3
diff --git a/cpp/.traces/subtract_literal b/cpp/.traces/subtract_literal
new file mode 100644
index 00000000..73bfce31
--- /dev/null
+++ b/cpp/.traces/subtract_literal
@@ -0,0 +1,9 @@
+parse/0: instruction: 3
+parse/0:   ingredient: {name: "5", type: 0}
+parse/0:   ingredient: {name: "2", type: 0}
+parse/0:   product: {name: "1", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 5
+run/0: ingredient 1 is 2
+run/0: product 0 is 3
+mem/0: storing in location 1
diff --git a/cpp/010vm b/cpp/010vm
index a8ce5bac..317f6d70 100644
--- a/cpp/010vm
+++ b/cpp/010vm
@@ -73,11 +73,11 @@ void setup_types() {
   Type.clear();  Type_number.clear();
   Type_number["literal"] = 0;
   Next_type_number = 1;
-  // New Types.
+  // Mu Types.
   int integer = Type_number["integer"] = 1;
   Type[integer].size = 1;
   Next_type_number++;
-  // End New Types.
+  // End Mu Types.
 }
 :(before "End Setup")
   setup_types();
@@ -105,10 +105,10 @@ void setup_recipes() {
   Recipe.clear();  Recipe_number.clear();
   Recipe_number["idle"] = 0;
   Next_recipe_number = 1;
-  // New Recipes.
+  // Primitive Recipe Numbers.
   Recipe_number["copy"] = 1;
   Next_recipe_number++;
-  // End New Recipes.
+  // End Primitive Recipe Numbers.
 }
 :(before "End Types")
 const int idle = 0;  // always the first entry in the recipe book
diff --git a/cpp/012run b/cpp/012run
index 2b14fd4b..abbe954a 100644
--- a/cpp/012run
+++ b/cpp/012run
@@ -13,8 +13,8 @@ recipe main [
   2:integer <- copy 1:integer
 ]
 +run: instruction 1
++run: ingredient 0 is 1
 +mem: location 1 is 23
-+run: ingredient 0 is 23
 +mem: storing in location 2
 
 :(code)
@@ -29,12 +29,14 @@ void run(recipe_number r) {
   for (n = 0, p = instructions.begin(); p != instructions.end(); ++p, ++n) {
     trace("run") << "instruction " << n;
     switch (p->operation) {
+    // Primitive Recipe Implementations.
     case 1: {  // copy
+      trace("run") << "ingredient 0 is " << p->ingredients[0].name;
       vector<int> data = read_memory(p->ingredients[0]);
-      trace("run") << "ingredient 0 is " << data[0];
       write_memory(p->products[0], data);
       break;
     }
+    // End Primitive Recipe Implementations.
     default:
       raise << "undefined operation " << p->operation;
     }
@@ -59,6 +61,206 @@ void write_memory(reagent x, vector<int> data) {
   Memory[dest] = data[0];
 }
 
+:(before "End Primitive Recipe Numbers")
+// Arithmetic ops.
+Recipe_number["add"] = 2;
+Next_recipe_number++;
+Recipe_number["subtract"] = 3;
+Next_recipe_number++;
+Recipe_number["multiply"] = 4;
+Next_recipe_number++;
+Recipe_number["divide"] = 5;
+Next_recipe_number++;
+Recipe_number["divide_with_remainder"] = 6;
+Next_recipe_number++;
+:(before "End Primitive Recipe Implementations")
+  case 2: {  // add
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    vector<int> result;
+    result.push_back(arg0[0]+arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 3: {  // subtract
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    vector<int> result;
+    result.push_back(arg0[0]-arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 4: {  // multiply
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    trace("run") << "ingredient 1 is " << arg1[0];
+    vector<int> result;
+    result.push_back(arg0[0]*arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 5: {  // divide
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    trace("run") << "ingredient 1 is " << arg1[0];
+    vector<int> result;
+    result.push_back(arg0[0]/arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 6: {  // divide_with_remainder
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    vector<int> result0;
+    result0.push_back(arg0[0]/arg1[0]);
+    trace("run") << "product 0 is " << result0[0];
+    write_memory(p->products[0], result0);
+    vector<int> result1;
+    result1.push_back(arg0[0]%arg1[0]);
+    trace("run") << "product 1 is " << result1[0];
+    write_memory(p->products[1], result1);
+    break;
+  }
+:(scenario "add_literal")
+recipe main [
+  1:integer <- add 23:literal, 34:literal
+]
++run: instruction 0
++run: ingredient 0 is 23
++run: ingredient 1 is 34
++run: product 0 is 57
++mem: storing in location 1
+:(scenario "add")
+recipe main [
+  1:integer <- copy 23:literal
+  2:integer <- copy 34:literal
+  3:integer <- add 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 23
++run: ingredient 1 is 2
++mem: location 2 is 34
++run: product 0 is 57
++mem: storing in location 3
+:(scenario "subtract_literal")
+recipe main [
+  1:integer <- subtract 5:literal, 2:literal
+]
++run: instruction 0
++run: ingredient 0 is 5
++run: ingredient 1 is 2
++run: product 0 is 3
++mem: storing in location 1
+:(scenario "subtract")
+recipe main [
+  1:integer <- copy 23:literal
+  2:integer <- copy 34:literal
+  3:integer <- subtract 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 23
++run: ingredient 1 is 2
++mem: location 2 is 34
++run: product 0 is -11
++mem: storing in location 3
+:(scenario "multiply_literal")
+recipe main [
+  1:integer <- multiply 2:literal, 3:literal
+]
++run: instruction 0
++run: ingredient 0 is 2
++run: ingredient 1 is 3
++run: product 0 is 6
++mem: storing in location 1
+:(scenario "multiply")
+recipe main [
+  1:integer <- copy 4:literal
+  2:integer <- copy 6:literal
+  3:integer <- multiply 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 4
++run: ingredient 1 is 2
++mem: location 2 is 6
++run: product 0 is 24
++mem: storing in location 3
+:(scenario "divide_literal")
+recipe main [
+  1:integer <- divide 8:literal, 2:literal
+]
++run: instruction 0
++run: ingredient 0 is 8
++run: ingredient 1 is 2
++run: product 0 is 4
++mem: storing in location 1
+:(scenario "divide")
+recipe main [
+  1:integer <- copy 27:literal
+  2:integer <- copy 3:literal
+  3:integer <- divide 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 27
++run: ingredient 1 is 2
++mem: location 2 is 3
++run: product 0 is 9
++mem: storing in location 3
+:(scenario "divide_with_remainder_literal")
+recipe main [
+  1:integer, 2:integer <- divide_with_remainder 9:literal, 2:literal
+]
++run: instruction 0
++run: ingredient 0 is 9
++run: ingredient 1 is 2
++run: product 0 is 4
++mem: storing in location 1
++run: product 1 is 1
++mem: storing in location 2
+:(scenario "divide_with_remainder")
+recipe main [
+  1:integer <- copy 27:literal
+  2:integer <- copy 11:literal
+  3:integer, 4:integer <- divide_with_remainder 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 27
++run: ingredient 1 is 2
++mem: location 2 is 11
++run: product 0 is 2
++mem: storing in location 3
++run: product 1 is 5
++mem: storing in location 4
+
+:(code)
 int to_int(string n) {
   char* end = NULL;
   int result = strtol(n.c_str(), &end, /*any base*/0);