fixing alloy performance bugs
[satune.git] / src / AlloyEnc / signature.cc
index 62c1c1a9972dfcc8dd657066275d43fa54b6e759..7201dc2a9a996155bb68b573314b2111ece598ed 100644 (file)
@@ -1,12 +1,59 @@
 #include "signature.h"
 #include "set.h"
 
+bool BooleanSig::encodeAbs = true;
+bool SetSig::encodeAbs = true;
+bool ElementSig::encodeAbs = true;
+
+BooleanSig::BooleanSig(uint id):
+       Signature(id),
+       value(-1)
+{
+}
+
+bool BooleanSig::getValue(){
+       ASSERT(value != -1);
+       return (bool) value;
+}
+
+string BooleanSig::toString() const{
+       return "Boolean" + to_string(id) + ".value";
+}
+
+string BooleanSig::getSignature() const{
+       string str;
+       if(encodeAbs){
+               encodeAbs = false;
+               str += getAbsSignature();
+       }
+       str += "one sig Boolean" + to_string(id) + " extends AbsBool {}";
+       return str;
+}
+
+string BooleanSig::getAbsSignature() const{
+       string str;
+       if(SetSig::encodeAbs){
+               SetSig::encodeAbs = false;
+               str += "abstract sig AbsSet {\
+               domain: set Int\
+               }\n";
+       }
+       str +="one sig BooleanSet extends AbsSet {}{\n\
+       domain = 0 + 1 \n\
+       }\n\
+       abstract sig AbsBool {\
+       value: Int\
+       }{\n\
+       value in BooleanSet.domain\n\
+       }\n";
+       return str;
+}
+
 ElementSig::ElementSig(uint id, SetSig *_ssig): 
        Signature(id),
        ssig(_ssig),
        value(0)
 {
-       
 }
 
 string ElementSig::toString() const{
@@ -14,11 +61,21 @@ string ElementSig::toString() const{
 }
 
 string ElementSig::getSignature() const{
-       return "one sig Element" + to_string(id) + " {\n\
-               value: Int\n\
-               }{\n\
+       string str;
+       if(encodeAbs){
+               encodeAbs = false;
+               str += getAbsSignature();
+       }
+       str += "one sig Element" + to_string(id) + " extends AbsElement {}{\n\
                value in " + *ssig + "\n\
                }";
+       return str;
+}
+
+string ElementSig::getAbsSignature() const{
+       return "abstract sig AbsElement {\n\
+               value: Int\n\
+               }\n";
        
 }
 
@@ -35,11 +92,21 @@ string SetSig::toString() const{
 }
 
 string SetSig::getSignature() const{
-       return "one sig Set" + to_string(id) + " {\n\
-               domain: set Int\n\
-               }{\n\
+       string str;
+       if(encodeAbs){
+               encodeAbs = false;
+               str += getAbsSignature();
+       }
+       str += "one sig Set" + to_string(id) + " extends AbsSet {}{\n\
                domain = " + domain + "\n\
                }";
+       return str;
+}
+
+string SetSig::getAbsSignature() const{
+       return "abstract sig AbsSet {\n\
+               domain: set Int\n\
+               }\n";
        
 }