Add timing statements
[satune.git] / src / AST / function.cc
index 6715e79e06e0115dc91449c02c768f4a7028472d..c38551246ef93a5e231624a7474e202268f63d1a 100644 (file)
@@ -2,11 +2,20 @@
 #include "table.h"
 #include "set.h"
 #include "csolver.h"
+#include "serializer.h"
 
-FunctionOperator::FunctionOperator(ArithOp _op, Set **domain, uint numDomain, Set *_range, OverFlowBehavior _overflowbehavior) : Function(OPERATORFUNC), op(_op), domains(domain, numDomain), range(_range), overflowbehavior(_overflowbehavior) {
+FunctionOperator::FunctionOperator(ArithOp _op, Set **domain, uint numDomain, Set *_range, OverFlowBehavior _overflowbehavior) :
+       Function(OPERATORFUNC),
+       op(_op),
+       domains(domain, numDomain),
+       range(_range),
+       overflowbehavior(_overflowbehavior) {
 }
 
-FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) : Function(TABLEFUNC), table(_table), undefBehavior(_undefBehavior) {
+FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) :
+       Function(TABLEFUNC),
+       table(_table),
+       undefBehavior(_undefBehavior) {
 }
 
 uint64_t FunctionOperator::applyFunctionOperator(uint numVals, uint64_t *values) {
@@ -52,3 +61,59 @@ Function *FunctionTable::clone(CSolver *solver, CloneMap *map) {
        map->put(this, f);
        return f;
 }
+
+Set *FunctionTable::getRange() {
+       return table->getRange();
+}
+
+void FunctionTable::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
+               return;
+       serializer->addObject(this);
+
+       table->serialize(serializer);
+
+       ASTNodeType type = FUNCTABLETYPE;
+       serializer->mywrite(&type, sizeof(ASTNodeType));
+       FunctionTable *This = this;
+       serializer->mywrite(&This, sizeof(FunctionTable *));
+       serializer->mywrite(&table, sizeof(Table *));
+       serializer->mywrite(&undefBehavior, sizeof(UndefinedBehavior));
+
+}
+
+void FunctionTable::print() {
+       model_print("{FunctionTable:\n");
+       table->print();
+       model_print("}\n");
+}
+
+void FunctionOperator::serialize(Serializer *serializer) {
+       if (serializer->isSerialized(this))
+               return;
+       serializer->addObject(this);
+
+       uint size = domains.getSize();
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
+               domain->serialize(serializer);
+       }
+       range->serialize(serializer);
+
+       ASTNodeType nodeType = FUNCOPTYPE;
+       serializer->mywrite(&nodeType, sizeof(ASTNodeType));
+       FunctionOperator *This = this;
+       serializer->mywrite(&This, sizeof(FunctionOperator *));
+       serializer->mywrite(&op, sizeof(ArithOp));
+       serializer->mywrite(&size, sizeof(uint));
+       for (uint i = 0; i < size; i++) {
+               Set *domain = domains.get(i);
+               serializer->mywrite(&domain, sizeof(Set *));
+       }
+       serializer->mywrite(&range, sizeof(Set *));
+       serializer->mywrite(&overflowbehavior, sizeof(OverFlowBehavior));
+}
+
+void FunctionOperator::print() {
+       model_print("{FunctionOperator: %s}\n", op == SATC_ADD ? "ADD" : "SUB" );
+}