Browse Source

feat: `ALLOW_` and `MOVE_` macro in core

master
Dnomd343 2 years ago
parent
commit
e9d8b5047f
  1. 155
      src/core_demo.cc

155
src/core_demo.cc

@ -5,41 +5,51 @@
int cache_size; int cache_size;
cache_t cache[16]; cache_t cache[16];
#define release_1x1(filter_dir) { \ #define ALLOW_UP (filter != UP)
#define ALLOW_DOWN (filter != DOWN)
#define ALLOW_LEFT (filter != LEFT)
#define ALLOW_RIGHT (filter != RIGHT)
#define MOVE_UP (next_addr = addr + UP)
#define MOVE_DOWN (next_addr = addr + DOWN)
#define MOVE_LEFT (next_addr = addr + LEFT)
#define MOVE_RIGHT (next_addr = addr + RIGHT)
#define release_1x1(_filter) { \
cache_t next_case = { \ cache_t next_case = { \
.code = code & ~(F_1x1 << addr) | (C_1x1 << next_addr), \ .code = code & ~(F_1x1 << addr) | (C_1x1 << next_addr), \
.mask = (uint64_t)0b111 << next_addr, \ .mask = F_1x1 << next_addr, \
.filter = filter_dir, \ .filter = _filter, \
.addr = next_addr \ .addr = next_addr \
}; \ }; \
cache_insert(next_case); \ cache_insert(next_case); \
} }
#define release_1x2(filter_dir) { \ #define release_1x2(_filter) { \
cache_t next_case = { \ cache_t next_case = { \
.code = code & ~(F_1x2 << addr) | (C_1x2 << next_addr), \ .code = code & ~(F_1x2 << addr) | (C_1x2 << next_addr), \
.mask = (uint64_t)0b111 << next_addr, \ .mask = F_1x1 << next_addr, \
.filter = filter_dir, \ .filter = _filter, \
.addr = next_addr \ .addr = next_addr \
}; \ }; \
cache_insert(next_case); \ cache_insert(next_case); \
} }
#define release_2x1(filter_dir) { \ #define release_2x1(_filter) { \
cache_t next_case = { \ cache_t next_case = { \
.code = code & ~(F_2x1 << addr) | (C_2x1 << next_addr), \ .code = code & ~(F_2x1 << addr) | (C_2x1 << next_addr), \
.mask = (uint64_t)0b111 << next_addr, \ .mask = F_1x1 << next_addr, \
.filter = filter_dir, \ .filter = _filter, \
.addr = next_addr \ .addr = next_addr \
}; \ }; \
cache_insert(next_case); \ cache_insert(next_case); \
} }
#define release_2x2(filter_dir) { \ #define release_2x2(_filter) { \
cache_t next_case = { \ cache_t next_case = { \
.code = code & ~(F_2x2 << addr) | (C_2x2 << next_addr), \ .code = code & ~(F_2x2 << addr) | (C_2x2 << next_addr), \
.mask = (uint64_t)0b111 << next_addr, \ .mask = F_1x1 << next_addr, \
.filter = filter_dir, \ .filter = _filter, \
.addr = next_addr \ .addr = next_addr \
}; \ }; \
cache_insert(next_case); \ cache_insert(next_case); \
@ -47,15 +57,12 @@ cache_t cache[16];
inline bool cache_insert(cache_t &new_item) { inline bool cache_insert(cache_t &new_item) {
static int match_num = 0; // static int insert_num = 0;
// std::cout << "insert times: " << ++match_num << std::endl; // std::cout << "insert times: " << ++insert_num << std::endl;
auto *p = cache; auto *p = cache;
for (; p < cache + cache_size; ++p) { for (; p < cache + cache_size; ++p) {
if (p->code == new_item.code) { if (p->code == new_item.code) {
p->filter |= new_item.filter;
return false; // already exist -> insert failed return false; // already exist -> insert failed
} }
} }
@ -68,8 +75,7 @@ void move_1x1(uint64_t code, int addr) {
cache_size = 1; cache_size = 1;
cache[0].code = code; cache[0].code = code;
cache[0].addr = addr; cache[0].addr = addr;
// cache[0].filter = 0; // filter unset cache[0].filter = 0; // filter unset
cache[0].filter = 0b0000; // filter unset
int current = 0; int current = 0;
while (current != cache_size) { // start bfs search while (current != cache_size) { // start bfs search
@ -78,33 +84,18 @@ void move_1x1(uint64_t code, int addr) {
int next_addr; // address after block moved int next_addr; // address after block moved
int filter = cache[current++].filter; // case filter int filter = cache[current++].filter; // case filter
if (ALLOW_UP && addr >= 4 * 3 && !(code >> MOVE_UP & F_1x1)) {
if (!(filter & 0b0001) && addr >= 4 * 3 && !(code >> (next_addr = addr + UP) & F_1x1)) { release_1x1(-UP) // 1x1 block move up
release_1x1(0b0010) // 1x1 block move up
} }
if (!(filter & 0b0010) && addr <= 15 * 3 && !(code >> (next_addr = addr + DOWN) & F_1x1)) { if (ALLOW_DOWN && addr <= 15 * 3 && !(code >> MOVE_DOWN & F_1x1)) {
release_1x1(0b0001) // 1x1 block move down release_1x1(-DOWN) // 1x1 block move down
} }
if (!(filter & 0b0100) && (addr & 3) != 0 && !(code >> (next_addr = addr + LEFT) & F_1x1)) { if (ALLOW_LEFT && (addr & 3) != 0 && !(code >> MOVE_LEFT & F_1x1)) {
release_1x1(0b1000) // 1x1 block move left release_1x1(-LEFT) // 1x1 block move left
} }
if (!(filter & 0b1000) && (addr & 3) != 1 && !(code >> (next_addr = addr + RIGHT) & F_1x1)) { if (ALLOW_RIGHT && (addr & 3) != 1 && !(code >> MOVE_RIGHT & F_1x1)) {
release_1x1(0b0100) // 1x1 block move right release_1x1(-RIGHT) // 1x1 block move right
} }
// if (filter != UP && addr >= 4 * 3 && !(code >> (next_addr = addr + UP) & F_1x1)) {
// release_1x1(-UP) // 1x1 block move up
// }
// if (filter != DOWN && addr <= 15 * 3 && !(code >> (next_addr = addr + DOWN) & F_1x1)) {
// release_1x1(-DOWN) // 1x1 block move down
// }
// if (filter != LEFT && (addr & 3) != 0 && !(code >> (next_addr = addr + LEFT) & F_1x1)) {
// release_1x1(-LEFT) // 1x1 block move left
// }
// if (filter != RIGHT && (addr & 3) != 1 && !(code >> (next_addr = addr + RIGHT) & F_1x1)) {
// release_1x1(-RIGHT) // 1x1 block move right
// }
} }
} }
@ -121,16 +112,16 @@ void move_1x2(uint64_t code, int addr) {
int next_addr; // address after block moved int next_addr; // address after block moved
int filter = cache[current++].filter; // case filter int filter = cache[current++].filter; // case filter
if (filter != UP && addr >= 4 * 3 && !(code >> (next_addr = addr + UP) & F_1x2)) { if (ALLOW_UP && addr >= 4 * 3 && !(code >> MOVE_UP & F_1x2)) {
release_1x2(-UP) // 1x2 block move up release_1x2(-UP) // 1x2 block move up
} }
if (filter != DOWN && addr <= 14 * 3 && !(code >> (next_addr = addr + DOWN) & F_1x2)) { if (ALLOW_DOWN && addr <= 14 * 3 && !(code >> MOVE_DOWN & F_1x2)) {
release_1x2(-DOWN) // 1x2 block move down release_1x2(-DOWN) // 1x2 block move down
} }
if (filter != LEFT && (addr & 3) != 0 && !(code >> (next_addr = addr + LEFT) & F_1x1)) { if (ALLOW_LEFT && (addr & 3) != 0 && !(code >> MOVE_LEFT & F_1x1)) {
release_1x2(-LEFT) // 1x2 block move left release_1x2(-LEFT) // 1x2 block move left
} }
if (filter != RIGHT && (addr & 3) != 2 && !(code >> (next_addr = addr + RIGHT) & F_1x1_R)) { if (ALLOW_RIGHT && (addr & 3) != 2 && !(code >> MOVE_RIGHT & F_1x1_R)) {
release_1x2(-RIGHT) // 1x2 block move right release_1x2(-RIGHT) // 1x2 block move right
} }
} }
@ -149,16 +140,16 @@ void move_2x1(uint64_t code, int addr) {
int next_addr; // address after block moved int next_addr; // address after block moved
int filter = cache[current++].filter; // case filter int filter = cache[current++].filter; // case filter
if (filter != UP && addr >= 4 * 3 && !(code >> (next_addr = addr + UP) & F_1x1)) { if (ALLOW_UP && addr >= 4 * 3 && !(code >> MOVE_UP & F_1x1)) {
release_2x1(-UP) // 2x1 block move up release_2x1(-UP) // 2x1 block move up
} }
if (filter != DOWN && addr <= 11 * 3 && !(code >> (next_addr = addr + DOWN) & F_1x1_D)) { if (ALLOW_DOWN && addr <= 11 * 3 && !(code >> MOVE_DOWN & F_1x1_D)) {
release_2x1(-DOWN) // 2x1 block move down release_2x1(-DOWN) // 2x1 block move down
} }
if (filter != LEFT && (addr & 0x3) != 0 && !(code >> (next_addr = addr + LEFT) & F_2x1)) { if (ALLOW_LEFT && (addr & 0x3) != 0 && !(code >> MOVE_LEFT & F_2x1)) {
release_2x1(-LEFT) // 2x1 block move left release_2x1(-LEFT) // 2x1 block move left
} }
if (filter != RIGHT && (addr & 0x3) != 1 && !(code >> (next_addr = addr + RIGHT) & F_2x1)) { if (ALLOW_RIGHT && (addr & 0x3) != 1 && !(code >> MOVE_RIGHT & F_2x1)) {
release_2x1(-RIGHT) // 2x1 block move right release_2x1(-RIGHT) // 2x1 block move right
} }
} }
@ -178,16 +169,16 @@ void move_2x2(uint64_t code, int addr) {
int next_addr; // address after block moved int next_addr; // address after block moved
int filter = cache[current++].filter; // case filter int filter = cache[current++].filter; // case filter
if (filter != UP && addr >= 4 * 3 && !(code >> (next_addr = addr + UP) & F_1x2)) { if (ALLOW_UP && addr >= 4 * 3 && !(code >> MOVE_UP & F_1x2)) {
release_2x2(-UP) // 2x2 block move up release_2x2(-UP) // 2x2 block move up
} }
if (filter != DOWN && addr <= 10 * 3 && !(code >> (next_addr = addr + DOWN) & F_1x2_D)) { if (ALLOW_DOWN && addr <= 10 * 3 && !(code >> MOVE_DOWN & F_1x2_D)) {
release_2x2(-DOWN) // 2x2 block move down release_2x2(-DOWN) // 2x2 block move down
} }
if (filter != LEFT && (addr & 3) != 0 && !(code >> (next_addr = addr + LEFT) & F_2x1)) { if (ALLOW_LEFT && (addr & 3) != 0 && !(code >> MOVE_LEFT & F_2x1)) {
release_2x2(-LEFT) // 2x2 block move left release_2x2(-LEFT) // 2x2 block move left
} }
if (filter != RIGHT && (addr & 3) != 2 && !(code >> (next_addr = addr + RIGHT) & F_2x1_R)) { if (ALLOW_RIGHT && (addr & 3) != 2 && !(code >> MOVE_RIGHT & F_2x1_R)) {
release_2x2(-RIGHT) // 2x2 block move right release_2x2(-RIGHT) // 2x2 block move right
} }
} }
@ -196,12 +187,12 @@ void move_2x2(uint64_t code, int addr) {
void next_step(uint64_t raw_code, uint64_t mask) { void next_step(uint64_t raw_code, uint64_t mask) {
// int addr = 17; int addr = 17;
// raw_code = RawCode(CommonCode("4fea134")).unwrap(); raw_code = RawCode(CommonCode("4fea134")).unwrap();
// move_1x1(raw_code, addr * 3); // move_1x1(raw_code, addr * 3);
int addr = 9; // int addr = 9;
raw_code = RawCode(CommonCode("1003")).unwrap(); // raw_code = RawCode(CommonCode("1003")).unwrap();
// move_1x1(raw_code, addr * 3); // move_1x1(raw_code, addr * 3);
// int addr = 9; // int addr = 9;
@ -216,34 +207,34 @@ void next_step(uint64_t raw_code, uint64_t mask) {
// std::cout << RawCode(raw_code).dump_case(); // std::cout << RawCode(raw_code).dump_case();
// printf("mask -> %016lX\n", mask); // printf("mask -> %016lX\n", mask);
// for (int i = 0; i < 1000000000; ++i) { for (int i = 0; i < 1000000000; ++i) {
for (int i = 0; i < 50000000; ++i) { // for (int i = 0; i < 50000000; ++i) {
move_1x1(raw_code, addr * 3); move_1x1(raw_code, addr * 3);
} }
std::cout << "cache size: " << cache_size << std::endl; std::cout << "cache size: " << cache_size << std::endl;
// for (int i = 0; i < cache_size; ++i) { for (int i = 0; i < cache_size; ++i) {
// std::cout << "=======" << std::endl; std::cout << "=======" << std::endl;
//
// std::cout << RawCode(cache[i].code).dump_case(); std::cout << RawCode(cache[i].code).dump_case();
//
// if (i != 0) { if (i != 0) {
// auto _mask = cache[i].mask; auto _mask = cache[i].mask;
// std::cout << std::endl; std::cout << std::endl;
// for (int n = 0; n < 20; ++n, _mask >>= 3) { for (int n = 0; n < 20; ++n, _mask >>= 3) {
// if (_mask & 0b111) { if (_mask & 0b111) {
// std::cout << "+ "; std::cout << "+ ";
// } else { } else {
// std::cout << ". "; std::cout << ". ";
// } }
// if ((n & 0b11) == 0b11) { if ((n & 0b11) == 0b11) {
// std::cout << std::endl; std::cout << std::endl;
// } }
// } }
// } }
//
// std::cout << "=======" << std::endl << std::endl; std::cout << "=======" << std::endl << std::endl;
// } }
} }

Loading…
Cancel
Save