summaryrefslogtreecommitdiff
path: root/omega/omega_lib/src/RelVar.cc
diff options
context:
space:
mode:
authordhuth <derickhuth@gmail.com>2014-10-06 11:56:47 -0600
committerdhuth <derickhuth@gmail.com>2014-10-06 11:56:47 -0600
commite4b20015a4ee35f1279af4caa983478fa2ff0d4a (patch)
treef47cbff8b2bba458b54a739e91a87b303f7665f1 /omega/omega_lib/src/RelVar.cc
parent600fa18324c21a162c50c40ae5f00c899a41dd24 (diff)
downloadchill-e4b20015a4ee35f1279af4caa983478fa2ff0d4a.tar.gz
chill-e4b20015a4ee35f1279af4caa983478fa2ff0d4a.tar.bz2
chill-e4b20015a4ee35f1279af4caa983478fa2ff0d4a.zip
Added omega to source
Diffstat (limited to 'omega/omega_lib/src/RelVar.cc')
-rw-r--r--omega/omega_lib/src/RelVar.cc71
1 files changed, 71 insertions, 0 deletions
diff --git a/omega/omega_lib/src/RelVar.cc b/omega/omega_lib/src/RelVar.cc
new file mode 100644
index 0000000..d9b977c
--- /dev/null
+++ b/omega/omega_lib/src/RelVar.cc
@@ -0,0 +1,71 @@
+#include <omega/RelBody.h>
+#include <omega/omega_i.h>
+
+namespace omega {
+
+Variable_ID Rel_Body::get_local(const Variable_ID v) {
+ Global_Var_ID g;
+ if (v->kind() == Global_Var) {
+ g = v->get_global_var();
+ if (g->arity()) return get_local(g,v->function_of());
+ return get_local(g);
+ }
+ if (is_set()) return set_var(v->get_position());
+ if (v->kind() == Input_Var) return input_var(v->get_position());
+ if (v->kind() == Output_Var) return output_var(v->get_position());
+ assert(0 && "Can only get local for variable with global scope");
+ exit(1);
+ return 0;
+}
+
+//
+// Find or declare global variable.
+// If the VarID does not exist, it is created. Otherwise it's returned.
+// Note that this version now works only for 0-ary functions.
+//
+Variable_ID Rel_Body::get_local(const Global_Var_ID G) {
+ assert(G->arity() == 0);
+ for(Variable_Iterator i(Symbolic); i; i++)
+ if ((*i)->get_global_var() == G)
+ return (*i);
+
+ Variable_ID v = G->get_local();
+ Symbolic.append(v);
+ return v;
+}
+
+
+Variable_ID Rel_Body::get_local(const Global_Var_ID G, Argument_Tuple of) {
+ assert(G->arity() == 0 || of == Input_Tuple || of == Output_Tuple);
+
+ for(Variable_Iterator i = Symbolic; i; i++)
+ if ((*i)->get_global_var() == G && (G->arity() == 0 ||
+ of == (*i)->function_of()))
+ return (*i);
+
+ Variable_ID V = G->get_local(of);
+ Symbolic.append(V);
+ return V;
+}
+
+
+bool Rel_Body::has_local(const Global_Var_ID G) {
+ assert(G->arity() == 0);
+ for(Variable_Iterator i = Symbolic; i; i++)
+ if ((*i)->get_global_var() == G)
+ return true;
+ return false;
+}
+
+
+bool Rel_Body::has_local(const Global_Var_ID G, Argument_Tuple of) {
+ assert(G->arity() == 0 || of == Input_Tuple || of == Output_Tuple);
+
+ for(Variable_Iterator i = Symbolic; i; i++)
+ if ((*i)->get_global_var() == G && (G->arity() == 0 ||
+ of == (*i)->function_of()))
+ return true;
+ return false;
+}
+
+} // namespace