diff --git a/CPP/register_modeling/example_project/problem_test.txt b/CPP/register_modeling/example_project/problem_test.txt index 27e7e2f..ed7d1ee 100644 --- a/CPP/register_modeling/example_project/problem_test.txt +++ b/CPP/register_modeling/example_project/problem_test.txt @@ -34,22 +34,17 @@ struct BitField BitField& operator =(T v) { -/* - // this step can be optimised for systems that support bitbandalias - T mask = ((1ULL << SIZE)-1) << START; - _raw &= ~mask; - _raw |= ((v & ((1ULL << SIZE)-1)) << START); +#if 0 + _raw = ((v & ((1ULL << SIZE)-1)) << START); return *this; - */ - - - - //#ifdef old - //TODO: test = problem with |= instead of = - // mask creation for v : https://stackoverflow.com/questions/1392059/algorithm-to-generate-bit-mask +#else + //_raw & ~(((1ULL << SIZE)-1) << START); + + // use bit band alias if system permits _raw = ((v & ((1ULL << SIZE)-1)) << START) | (_raw & ~(((1ULL << SIZE)-1) << START)); return *this; //#endif +#endif } /** @@ -77,29 +72,29 @@ struct BitField }; union Reg_Control - { - // bit 4 - struct POWER_DEV{ - typedef BitField Bits; - enum{TURN_OFF = 0, TURN_ON = 1}; - }; - // bits 2-3 - struct SPEED{ - typedef BitField Bits; - enum{STAND_STILL = 0, - SLOW = 1, - NORMAL = 2, - FAST = 3}; - }; - struct Bits{ - Reg_Control::POWER_DEV::Bits POWER_DEV; - Reg_Control::SPEED::Bits SPEED; - } bits; - // raw value. all bitfields will be "unified" here ;) - uint8_t raw; - // union Ctor with default value set to 0x00 - Reg_Control(uint8_t v = 0x00) : raw(v) {} - }; +{ + // bit 4 + struct POWER_DEV{ + typedef BitField Bits; + enum{TURN_OFF = 0, TURN_ON = 1}; + }; + // bits 2-3 + struct SPEED{ + typedef BitField Bits; + enum{STAND_STILL = 0, + SLOW = 1, + NORMAL = 2, + FAST = 3}; + }; + union Bits{ + Reg_Control::POWER_DEV::Bits POWER_DEV; + Reg_Control::SPEED::Bits SPEED; + } bits; + // raw value. all bitfields will be "unified" here ;) + uint8_t raw; + // union Ctor with default value set to 0x00 + Reg_Control(uint8_t v = 0x00) : raw(v) {} +}; @@ -107,15 +102,23 @@ int main() { Reg_Control reg; - reg.bits.SPEED = Reg_Control::SPEED::FAST; + //reg.bits.SPEED = Reg_Control::SPEED::FAST; reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON; std::cout << +reg.raw << std::endl; reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF; + + std::cout << +reg.raw << std::endl; + + reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON; reg.bits.SPEED = Reg_Control::SPEED::SLOW; + std::cout << +reg.raw << std::endl; + + reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF; + reg.bits.SPEED = Reg_Control::SPEED::FAST; std::cout << +reg.raw << std::endl;