/*
 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 <cmath>
#include <cstdint>
#include <cstring>
#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);
  if (b->getValueL(0))
    m_valueArray[0].m_value = a->getValueL(0) / b->getValueL(0);
  else
    m_valueArray[0].m_value = 69;
}

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);
}
