| /* |
| Copyright 2019 Alain Dargelas |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| /* |
| * File: Value.cpp |
| * Author: alain |
| * |
| * Created on October 29, 2017, 10:33 PM |
| */ |
| #include <string> |
| #include "Value.h" |
| |
| using namespace SURELOG; |
| |
| unsigned int Value::nbWords_(unsigned int size) { |
| unsigned long nb = size / 64; |
| if ((nb * 64) != size) nb++; |
| return nb; |
| } |
| |
| |
| SValue::~SValue () { } |
| |
| LValue::~LValue () |
| { |
| delete [] m_valueArray; |
| } |
| |
| StValue::~StValue () { } |
| |
| bool LValue::operator< (Value& rhs) { |
| // TODO |
| return true; |
| } |
| |
| bool LValue::operator==(Value& rhs) { |
| // TODO |
| return true; |
| } |
| |
| ValueFactory::ValueFactory() { |
| m_headFree = NULL; |
| m_headInUse = NULL; |
| } |
| |
| Value* ValueFactory::newSValue() { |
| return new SValue(); |
| } |
| |
| Value* ValueFactory::newStValue() { |
| return new StValue(); |
| } |
| |
| Value* ValueFactory::newLValue() { |
| if (m_headFree == NULL) |
| { |
| return new LValue(); |
| } |
| else |
| { |
| LValue* ret = m_headFree; |
| LValue* next = m_headFree->m_next; |
| LValue* prev = m_headFree->m_prev; |
| m_headFree = next; |
| if (prev == next) |
| { |
| m_headFree = NULL; |
| } |
| else |
| { |
| next->m_prev = prev; |
| prev->m_next = next; |
| } |
| ret->m_prev = NULL; |
| ret->m_next = NULL; |
| return ret; |
| } |
| } |
| |
| Value* ValueFactory::newValue(SValue& initVal) { |
| return new SValue(initVal); |
| } |
| |
| Value* ValueFactory::newValue(StValue& initVal) { |
| return new StValue(initVal); |
| } |
| |
| Value* ValueFactory::newValue(LValue& initVal) { |
| if (m_headFree == NULL) |
| { |
| return new LValue(initVal); |
| } |
| else |
| { |
| LValue* ret = m_headFree; |
| LValue* next = m_headFree->m_next; |
| LValue* prev = m_headFree->m_prev; |
| m_headFree = next; |
| if (prev == next) |
| { |
| m_headFree = NULL; |
| } |
| else |
| { |
| next->m_prev = prev; |
| prev->m_next = next; |
| } |
| ret->m_prev = NULL; |
| ret->m_next = NULL; |
| ret->adjust(&initVal); |
| for (unsigned int i = 0; i < ret->m_nbWords; i++) |
| { |
| ret->m_valueArray[i] = initVal.m_valueArray[i]; |
| } |
| |
| return ret; |
| } |
| } |
| |
| void ValueFactory::deleteValue(Value* value) { |
| if (value->getType () == Value::String) |
| { |
| //TODO: investigate memory corruption |
| //delete (StValue*) value; |
| return; |
| } |
| LValue* val = (LValue*) value; |
| Value* prev = m_headFree; |
| if (prev == NULL) |
| { |
| m_headFree = (LValue*) val; |
| m_headFree->m_next = m_headFree; |
| m_headFree->m_prev = m_headFree; |
| } |
| else |
| { |
| LValue* next = m_headFree; |
| LValue* prev = m_headFree->m_prev; |
| next->m_prev = val; |
| prev->m_next = val; |
| val->m_next = next; |
| val->m_prev = prev; |
| m_headFree = val; |
| } |
| } |
| |
| void SValue::set (unsigned long val){ |
| m_value = val; m_size = 64; |
| } |
| void SValue::set (long val){ |
| m_value = val; m_size = 64; |
| } |
| void SValue::set (double val){ |
| m_value = (unsigned long) val; m_size = 64; |
| } |
| void SValue::set (unsigned long val, ValueType type, unsigned short size){ |
| m_value = val; m_size = size; |
| } |
| |
| |
| void SValue::u_plus (Value* a) { |
| SValue* aval = (SValue*) a; |
| m_size = aval->m_size; |
| m_value = aval->m_value; |
| } |
| |
| void SValue::incr() { |
| m_value++; |
| } |
| |
| void SValue::decr() { |
| m_value--; |
| } |
| |
| void SValue::u_minus (Value* a) { |
| SValue* aval = (SValue*) a; |
| m_size = aval->m_size; |
| m_value = - aval->m_value; |
| } |
| |
| void SValue::u_not (Value* a) { |
| SValue* aval = (SValue*) a; |
| m_size = aval->m_size; |
| m_value = ! aval->m_value; |
| } |
| |
| void SValue::u_tilda (Value* a) { |
| SValue* aval = (SValue*) a; |
| m_size = aval->m_size; |
| m_value = ~ aval->m_value; |
| } |
| |
| void SValue::plus (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value + bval->m_value; |
| } |
| |
| void SValue::minus (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value - bval->m_value; |
| } |
| |
| void SValue::mult (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value * bval->m_value; |
| } |
| |
| void SValue::div (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value / bval->m_value; |
| } |
| |
| void SValue::mod (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value % bval->m_value; |
| } |
| |
| void SValue::greater (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value > bval->m_value; |
| } |
| |
| void SValue::greater_equal (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value >= bval->m_value; |
| } |
| |
| void SValue::lesser (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value < bval->m_value; |
| } |
| |
| void SValue::lesser_equal (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value <= bval->m_value; |
| } |
| |
| void SValue::equiv (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value == bval->m_value; |
| } |
| |
| void SValue::logAnd (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value && bval->m_value; |
| } |
| |
| void SValue::logOr (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value || bval->m_value; |
| } |
| |
| void SValue::bitwAnd (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value & bval->m_value; |
| } |
| |
| void SValue::bitwOr (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value | bval->m_value; |
| } |
| |
| void SValue::bitwXor (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value ^ bval->m_value; |
| } |
| |
| void SValue::notEqual (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value != bval->m_value; |
| } |
| |
| void SValue::shiftLeft (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value << bval->m_value; |
| } |
| |
| void SValue::shiftRight (Value* a, Value* b) { |
| SValue* aval = (SValue*) a; |
| SValue* bval = (SValue*) b; |
| m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| m_value = aval->m_value >> bval->m_value; |
| } |
| |
| |
| unsigned short LValue::getSize() { |
| unsigned short size = 0; |
| for (int i = 0; i < m_nbWords; i++) |
| { |
| size += m_valueArray[i].m_size; |
| } |
| return size; |
| } |
| |
| LValue::LValue(LValue& val) { |
| m_type = val.m_type; |
| m_prev = NULL; |
| m_next = NULL; |
| m_nbWords = val.m_nbWords; |
| m_valueArray = new SValue[val.m_nbWords]; |
| for (int i = 0; i < val.m_nbWords; i++) |
| { |
| m_valueArray[i] = val.m_valueArray[i]; |
| } |
| } |
| |
| LValue::LValue(unsigned long val) { |
| m_type = Unsigned; |
| m_nbWords = 1; |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = val; |
| m_valueArray[0].m_size = 64; |
| m_prev = NULL; |
| m_next = NULL; |
| } |
| |
| LValue::LValue(long val) { |
| m_type = Integer; |
| m_nbWords = 1; |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = (unsigned long) val; |
| m_valueArray[0].m_size = 64; |
| m_prev = NULL; |
| m_next = NULL; |
| } |
| |
| LValue::LValue(double val) { |
| m_type = Double; |
| m_nbWords = 1; |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = (unsigned long) val; |
| m_valueArray[0].m_size = 64; |
| m_prev = NULL; |
| m_next = NULL; |
| } |
| |
| LValue::LValue(unsigned long val, ValueType type, unsigned short size) { |
| m_type = type; |
| m_nbWords = 1; |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = val; |
| m_valueArray[0].m_size = size; |
| m_prev = NULL; |
| m_next = NULL; |
| } |
| |
| void |
| LValue::set (unsigned long val) { |
| m_type = Unsigned; |
| m_nbWords = 1; |
| if (!m_valueArray) |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = val; |
| m_valueArray[0].m_size = 64; |
| } |
| |
| void LValue::set (long val){ |
| m_type = Integer; |
| m_nbWords = 1; |
| if (!m_valueArray) |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = (unsigned long) val; |
| m_valueArray[0].m_size = 64; |
| } |
| |
| void LValue::set (double val){ |
| m_type = Double; |
| m_nbWords = 1; |
| if (!m_valueArray) |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = (unsigned long) val; |
| m_valueArray[0].m_size = 64; |
| } |
| |
| void LValue::set (unsigned long val, ValueType type, unsigned short size){ |
| m_type = type; |
| m_nbWords = 1; |
| if (!m_valueArray) |
| m_valueArray = new SValue [1]; |
| m_valueArray[0].m_value = val; |
| m_valueArray[0].m_size = size; |
| } |
| |
| void LValue::adjust(Value* a) |
| { |
| m_type = a->getType (); |
| if (a->getNbWords () > getNbWords ()) |
| { |
| if (m_valueArray) |
| delete [] m_valueArray; |
| m_nbWords = a->getNbWords (); |
| m_valueArray = new SValue [m_nbWords]; |
| } |
| } |
| |
| void LValue::u_plus (Value* a) { |
| adjust(a); |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| m_valueArray[i].m_value = a->getValueUL (i); |
| } |
| } |
| |
| |
| void LValue::incr() { |
| m_valueArray[0].m_value++; |
| } |
| |
| void LValue::decr() { |
| m_valueArray[0].m_value--; |
| } |
| |
| void LValue::u_minus (Value* a) { |
| adjust(a); |
| for (unsigned short i = 0; i < m_nbWords; i++) |
| { |
| m_valueArray[i].m_value = a->getValueUL (i); |
| if (i == (m_nbWords -1)) |
| { |
| m_valueArray[i].m_value = ~m_valueArray[i].m_value + 1; |
| } |
| } |
| |
| } |
| |
| void LValue::u_not (Value* a) { |
| adjust(a); |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| m_valueArray[0].m_value |= a->getValueUL (i); |
| } |
| m_valueArray[0].m_value = ! m_valueArray[0].m_value; |
| } |
| |
| void LValue::u_tilda (Value* a) { |
| adjust(a); |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| m_valueArray[i].m_value = ~ a->getValueUL (i); |
| } |
| } |
| |
| void LValue::plus (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) + b->getValueL (0); |
| } |
| |
| void LValue::minus (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) - b->getValueL (0); |
| } |
| |
| void LValue::mult (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) * b->getValueL (0); |
| } |
| |
| void LValue::div (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) / b->getValueL (0); |
| } |
| |
| void LValue::mod (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) % b->getValueL (0); |
| } |
| |
| void LValue::greater (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) > b->getValueL (0); |
| } |
| |
| void LValue::greater_equal (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) >= b->getValueL (0); |
| } |
| |
| void LValue::lesser (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) < b->getValueL (0); |
| } |
| |
| void LValue::lesser_equal (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueL (0) <= b->getValueL (0); |
| } |
| |
| void LValue::equiv (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| if (a->getValueUL (i) != b->getValueUL (i)) |
| { |
| m_valueArray[0].m_value = 0; |
| return; |
| } |
| } |
| m_valueArray[0].m_value = 1; |
| } |
| |
| void LValue::logAnd (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| unsigned long tmp1 = 0; |
| unsigned long tmp2 = 0; |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| tmp1 |= a->getValueUL (i); |
| tmp2 |= b->getValueUL (i); |
| } |
| m_valueArray[0].m_value = tmp1 && tmp2; |
| } |
| |
| void LValue::logOr (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| unsigned long tmp1 = 0; |
| unsigned long tmp2 = 0; |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| tmp1 |= a->getValueUL (i); |
| tmp2 |= b->getValueUL (i); |
| } |
| m_valueArray[0].m_value = tmp1 || tmp2; |
| } |
| |
| void LValue::bitwAnd (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| m_valueArray[i].m_value = a->getValueUL (i) & b->getValueUL (i); |
| } |
| } |
| |
| void LValue::bitwOr (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| m_valueArray[i].m_value = a->getValueUL (i) | b->getValueUL (i); |
| } |
| |
| } |
| |
| void LValue::bitwXor (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| for (unsigned int i = 0; i < m_nbWords; i++) |
| { |
| m_valueArray[i].m_value = a->getValueUL (i) ^ b->getValueUL (i); |
| } |
| |
| } |
| |
| void LValue::notEqual (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| equiv(a,b); |
| m_valueArray[0].m_value = !m_valueArray[0].m_value; |
| } |
| |
| void LValue::shiftLeft (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueUL (0) << b->getValueUL (0); |
| } |
| |
| void LValue::shiftRight (Value* a, Value* b) { |
| adjust(a); |
| adjust(b); |
| m_valueArray[0].m_value = a->getValueUL (0) >> b->getValueUL (0); |
| } |
| |
| |