|
|
@ -6,71 +6,6 @@ uint64_t RawCode::unwrap() const { // get raw uint64_t code |
|
|
|
return code; |
|
|
|
} |
|
|
|
|
|
|
|
CommonCode RawCode::to_common_code() const { |
|
|
|
uint32_t range = 0; |
|
|
|
uint64_t raw_code = code; |
|
|
|
uint32_t unfilled_num = 16; |
|
|
|
uint64_t head = ((uint64_t)16 << 32); // using invalid address
|
|
|
|
|
|
|
|
for (int addr = 0; raw_code; ++addr, raw_code >>= 3) { |
|
|
|
switch (raw_code & 0b111) { // get low 3-bits
|
|
|
|
case B_space: |
|
|
|
range <<= 2; // add space block
|
|
|
|
break; |
|
|
|
case B_1x2: |
|
|
|
(range <<= 2) |= 0b01; // add 1x2 block
|
|
|
|
break; |
|
|
|
case B_2x1: |
|
|
|
(range <<= 2) |= 0b10; // add 2x1 block
|
|
|
|
break; |
|
|
|
case B_1x1: |
|
|
|
(range <<= 2) |= 0b11; // add 1x1 block
|
|
|
|
break; |
|
|
|
case B_2x2: |
|
|
|
head = (uint64_t)addr << 32; // 2x2 block address
|
|
|
|
default: |
|
|
|
// TODO: should we throw an error?
|
|
|
|
continue; // unknown block type
|
|
|
|
} |
|
|
|
--unfilled_num; // less unfilled block
|
|
|
|
} |
|
|
|
// TODO: should we check the high 4-bits equal to zero?
|
|
|
|
|
|
|
|
// printf("head -> %09lX\n", head);
|
|
|
|
// printf("range -> %08X\n", range << 10);
|
|
|
|
// printf("unfilled -> %d\n", unfilled_num);
|
|
|
|
|
|
|
|
unfilled_num <<= 1; // aka unfilled_num *= 2
|
|
|
|
return CommonCode(head | (range << unfilled_num)); |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: check function for RawCode
|
|
|
|
|
|
|
|
RawCode::RawCode(const CommonCode &common_code) { |
|
|
|
// auto common_code_raw = common_code.unwrap(); // common code with uint64_t format
|
|
|
|
// code = C_2x2 << (common_code_raw >> 32) * 3; // flag for 2x2 block
|
|
|
|
// auto range = Common::range_reverse((uint32_t)common_code_raw); // load reversed range
|
|
|
|
//
|
|
|
|
// for (int addr = 0; range; range >>= 2) {
|
|
|
|
// while (0b111 & code >> addr) { // check low 3-bits -> until empty address
|
|
|
|
// addr += 3; // found available address
|
|
|
|
// }
|
|
|
|
// switch (range & 0b11) { // match low 2-bits
|
|
|
|
// case 0x1:
|
|
|
|
// code |= C_1x2 << addr; // add 1x2 block
|
|
|
|
// break;
|
|
|
|
// case 0x2:
|
|
|
|
// code |= C_2x1 << addr; // add 2x1 block
|
|
|
|
// break;
|
|
|
|
// case 0x3:
|
|
|
|
// code |= C_1x1 << addr; // add 1x1 block
|
|
|
|
// break;
|
|
|
|
// case 0x0:
|
|
|
|
// addr += 3; // next address
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
} |
|
|
|
|
|
|
|
std::string RawCode::dump_case() const { |
|
|
|
std::string result; |
|
|
|
result.reserve(40); // 5 lines * ("x x x x\n")
|
|
|
@ -91,6 +26,19 @@ std::string RawCode::dump_case() const { |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
bool RawCode::check(uint64_t raw_code) { |
|
|
|
|
|
|
|
// TODO: check function for RawCode
|
|
|
|
|
|
|
|
/// we can check any raw_code in this function
|
|
|
|
|
|
|
|
// TODO: for check function -> one 2x2 / >=2 space
|
|
|
|
|
|
|
|
// TODO: check the high 4-bits equal to zero
|
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|