Bug Fix: defining the scope of integer for Alloy
[satune.git] / src / AlloyEnc / signatureenc.cc
1 #include "signatureenc.h"
2 #include "element.h"
3 #include "set.h"
4 #include "signature.h"
5 #include "alloyenc.h"
6 #include "math.h"
7
8 SignatureEnc::SignatureEnc(AlloyEnc *ae): 
9         alloyEncoder(ae),
10         maxValue(0)
11 {
12 }
13
14 SignatureEnc::~SignatureEnc(){
15         for(uint i=0; i<signatures.getSize(); i++){
16                 Signature *s = signatures.get(i);
17                 delete s;
18         }
19 }
20
21 int SignatureEnc::getAlloyIntScope(){
22         double mylog = log2(maxValue + 1);
23         return floor(mylog) == mylog ? (int)mylog + 1: (int)mylog + 2;
24 }
25
26 void SignatureEnc::updateMaxValue(Set *set){
27         for(uint i=0; i< set->getSize(); i++){
28                 if(set->getElement(i) > maxValue){
29                         maxValue = set->getElement(i);
30                 }
31         }
32 }
33
34 ElementSig *SignatureEnc::getElementSignature(Element *element){
35         ElementSig *esig = (ElementSig *)encoded.get((void *)element);
36         if(esig == NULL){
37                 Set *set = element->getRange();
38                 SetSig *ssig = (SetSig *)encoded.get((void *)set);
39                 if(ssig == NULL){
40                         ssig = new SetSig(signatures.getSize(), set);
41                         encoded.put(set, ssig);
42                         signatures.push(ssig);
43                         alloyEncoder->writeToFile(ssig->getSignature());
44                         updateMaxValue(set);
45                 }
46                 esig = new ElementSig(signatures.getSize(), ssig);
47                 element->print();
48                 model_print(" = Element%u\n", signatures.getSize());
49                 encoded.put(element, esig);
50                 signatures.push(esig);
51                 alloyEncoder->writeToFile(esig->getSignature());
52
53         }
54         return esig;
55 }
56
57 void SignatureEnc::setValue(uint id, uint64_t value){
58         ElementSig *sig = (ElementSig *)signatures.get(id);
59         sig->setValue(value);
60 }
61
62 uint64_t SignatureEnc::getValue(Element *element){
63         ElementSig *sig = (ElementSig *)encoded.get((void *) element);
64         ASSERT(sig != NULL);
65         model_print("******************\n");
66         element->print();
67         model_print("Value = %" PRId64 "\n", sig->getValue());
68         return sig->getValue();
69 }