Created abstract OperatorRegister for all operators
Change-Id: I703106b311fae60af47e51d81b2f207e3c8a7189
Signed-off-by: Zane Shelley <zshelle@us.ibm.com>
diff --git a/src/isolator/hei_isolator.cpp b/src/isolator/hei_isolator.cpp
index 68dda7d..cb254aa 100644
--- a/src/isolator/hei_isolator.cpp
+++ b/src/isolator/hei_isolator.cpp
@@ -6,6 +6,7 @@
// BEGIN temporary code
#include <isolator/hei_isolation_node.hpp>
+#include <register/hei_operator_register.hpp>
#include <register/hei_scom_register.hpp>
// END temporary code
diff --git a/src/register/hei_operator_register.hpp b/src/register/hei_operator_register.hpp
index 7cfd627..a0d0f6c 100644
--- a/src/register/hei_operator_register.hpp
+++ b/src/register/hei_operator_register.hpp
@@ -5,7 +5,46 @@
namespace libhei
{
-class NotRegister : public Register
+/**
+ * @brief An abstract class for all operator registers.
+ *
+ * Contains member functions and variables that are required for all child
+ * classes.
+ */
+class OperatorRegister : public Register
+{
+ public:
+ /** @brief Pure virtual destructor. */
+ virtual ~OperatorRegister() = 0;
+
+ protected:
+ /**
+ * @brief Constructor from components.
+ * @param i_size Size (in bytes) of this register.
+ */
+ explicit OperatorRegister(size_t i_size) : Register(), iv_result(i_size * 8)
+ {}
+
+ protected: // Instance variables
+ /** When getBitString() is called on an operator, the resulting value of the
+ * operation will be stored in this instance variable. */
+ BitStringBuffer iv_result;
+
+ public:
+ /** @brief Overloaded from parent class. */
+ virtual const BitString* getBitString(const Chip& i_chip) const = 0;
+
+ /** @brief Overloaded from parent class. */
+ size_t getSize() const
+ {
+ return (BitString::getMinBytes(iv_result.getBitLen()));
+ }
+};
+
+// Pure virtual destructor must be defined.
+inline OperatorRegister::~OperatorRegister() {}
+
+class NotRegister : public OperatorRegister
{
public:
/**
@@ -13,7 +52,7 @@
* @param i_arg Target register for operation.
*/
explicit NotRegister(Register& i_arg) :
- Register(), iv_child(&i_arg), iv_iBS(i_arg.GetBitLength())
+ OperatorRegister(i_arg.getSize()), iv_child(&i_arg)
{}
/** @brief Default destructor. */
@@ -25,13 +64,14 @@
/** @brief Default assignment operator. */
NotRegister& operator=(const NotRegister& r) = default;
+ /** @brief Overloaded from parent class. */
const BitString* getBitString(const Chip& i_chip) const
{
const auto* bs = iv_child->getBitString(i_chip);
- (const_cast<NotRegister*>(this))->iv_iBS = ~(*bs);
+ (const_cast<NotRegister*>(this))->iv_result = ~(*bs);
- return &iv_iBS;
+ return &iv_result;
}
bool operator==(const NotRegister& r) const
@@ -46,11 +86,9 @@
private:
Register* iv_child;
-
- BitStringBuffer iv_iBS;
};
-class LeftShiftRegister : public Register
+class LeftShiftRegister : public OperatorRegister
{
public:
/**
@@ -59,8 +97,7 @@
* @param i_amount The shift value.
*/
LeftShiftRegister(Register& i_arg, uint16_t i_amount) :
- Register(), iv_child(&i_arg), iv_amount(i_amount),
- iv_iBS(i_arg.GetBitLength())
+ OperatorRegister(i_arg.getSize()), iv_child(&i_arg), iv_amount(i_amount)
{}
/** @brief Default destructor. */
@@ -72,13 +109,14 @@
/** @brief Default assignment operator. */
LeftShiftRegister& operator=(const LeftShiftRegister& r) = default;
+ /** @brief Overloaded from parent class. */
const BitString* getBitString(const Chip& i_chip) const
{
const auto* bs = iv_child->getBitString(i_chip);
- (const_cast<LeftShiftRegister*>(this))->iv_iBS = (*bs) << iv_amount;
+ (const_cast<LeftShiftRegister*>(this))->iv_result = (*bs) << iv_amount;
- return &iv_iBS;
+ return &iv_result;
}
bool operator==(const LeftShiftRegister& r) const
@@ -96,11 +134,9 @@
private:
Register* iv_child;
uint16_t iv_amount;
-
- BitStringBuffer iv_iBS;
};
-class RightShiftRegister : public Register
+class RightShiftRegister : public OperatorRegister
{
public:
/**
@@ -109,8 +145,7 @@
* @param i_amount The shift value.
*/
RightShiftRegister(Register& i_arg, uint16_t i_amount) :
- Register(), iv_child(&i_arg), iv_amount(i_amount),
- iv_iBS(i_arg.GetBitLength())
+ OperatorRegister(i_arg.getSize()), iv_child(&i_arg), iv_amount(i_amount)
{}
/** @brief Default destructor. */
@@ -122,13 +157,14 @@
/** @brief Default assignment operator. */
RightShiftRegister& operator=(const RightShiftRegister& r) = default;
+ /** @brief Overloaded from parent class. */
const BitString* getBitString(const Chip& i_chip) const
{
const auto* bs = iv_child->getBitString(i_chip);
- (const_cast<RightShiftRegister*>(this))->iv_iBS = (*bs) >> iv_amount;
+ (const_cast<RightShiftRegister*>(this))->iv_result = (*bs) >> iv_amount;
- return &iv_iBS;
+ return &iv_result;
}
bool operator==(const RightShiftRegister& r) const
@@ -146,11 +182,9 @@
private:
Register* iv_child;
uint16_t iv_amount;
-
- BitStringBuffer iv_iBS;
};
-class AndRegister : public Register
+class AndRegister : public OperatorRegister
{
public:
/**
@@ -159,8 +193,8 @@
* @param i_right Target register for operation.
*/
AndRegister(Register& i_left, Register& i_right) :
- Register(), iv_left(&i_left), iv_right(&i_right),
- iv_iBS(std::min(i_left.GetBitLength(), i_right.GetBitLength()))
+ OperatorRegister(std::min(i_left.getSize(), i_right.getSize())),
+ iv_left(&i_left), iv_right(&i_right)
{}
/** @brief Default destructor. */
@@ -172,14 +206,15 @@
/** @brief Default assignment operator. */
AndRegister& operator=(const AndRegister& r) = default;
+ /** @brief Overloaded from parent class. */
const BitString* getBitString(const Chip& i_chip) const
{
const auto* l_bs = iv_left->getBitString(i_chip);
const auto* r_bs = iv_right->getBitString(i_chip);
- (const_cast<AndRegister*>(this))->iv_iBS = (*l_bs) & (*r_bs);
+ (const_cast<AndRegister*>(this))->iv_result = (*l_bs) & (*r_bs);
- return &iv_iBS;
+ return &iv_result;
}
bool operator==(const AndRegister& r) const
@@ -197,11 +232,9 @@
private:
Register* iv_left;
Register* iv_right;
-
- BitStringBuffer iv_iBS;
};
-class OrRegister : public Register
+class OrRegister : public OperatorRegister
{
public:
/**
@@ -210,8 +243,8 @@
* @param i_right Target register for operation.
*/
OrRegister(Register& i_left, Register& i_right) :
- Register(), iv_left(&i_left), iv_right(&i_right),
- iv_iBS(std::min(i_left.GetBitLength(), i_right.GetBitLength()))
+ OperatorRegister(std::min(i_left.getSize(), i_right.getSize())),
+ iv_left(&i_left), iv_right(&i_right)
{}
/** @brief Default destructor. */
@@ -223,14 +256,15 @@
/** @brief Default assignment operator. */
OrRegister& operator=(const OrRegister& r) = default;
+ /** @brief Overloaded from parent class. */
const BitString* getBitString(const Chip& i_chip) const
{
const auto* l_bs = iv_left->getBitString(i_chip);
const auto* r_bs = iv_right->getBitString(i_chip);
- (const_cast<OrRegister*>(this))->iv_iBS = (*l_bs) | (*r_bs);
+ (const_cast<OrRegister*>(this))->iv_result = (*l_bs) | (*r_bs);
- return &iv_iBS;
+ return &iv_result;
}
bool operator==(const OrRegister& r) const
@@ -248,11 +282,9 @@
private:
Register* iv_left;
Register* iv_right;
-
- BitStringBuffer iv_iBS;
};
-class ConstantRegister : public Register
+class ConstantRegister : public OperatorRegister
{
public:
/**
@@ -260,8 +292,10 @@
* @param i_arg A BitStringBuffer containing the constant value.
*/
explicit ConstantRegister(const BitStringBuffer& i_arg) :
- Register(), iv_iBS(i_arg)
- {}
+ OperatorRegister(BitString::getMinBytes(i_arg.getBitLen()))
+ {
+ iv_result = i_arg;
+ }
/** @brief Default destructor. */
~ConstantRegister() = default;
@@ -272,18 +306,16 @@
/** @brief Default assignment operator. */
ConstantRegister& operator=(const ConstantRegister& r) = default;
+ /** @brief Overloaded from parent class. */
const BitString* getBitString(const Chip& i_chip) const
{
- return &iv_iBS;
+ return &iv_result;
}
bool operator==(const ConstantRegister& r) const
{
- return r.iv_iBS == iv_iBS;
+ return r.iv_result == iv_result;
}
-
- private:
- BitStringBuffer iv_iBS;
};
} // end namespace libhei
diff --git a/src/register/hei_register.hpp b/src/register/hei_register.hpp
index 5246a5a..d3435a3 100644
--- a/src/register/hei_register.hpp
+++ b/src/register/hei_register.hpp
@@ -37,6 +37,9 @@
* @return A BitString containing the value of this register.
*/
virtual const BitString* getBitString(const Chip& i_chip) const = 0;
+
+ /** @return The size (in bytes) of this register. */
+ virtual size_t getSize() const = 0;
};
// Pure virtual destructor must be defined.