|
@ -10,6 +10,10 @@ cache_t cache[16]; |
|
|
#define ALLOW_LEFT (filter != -LEFT) |
|
|
#define ALLOW_LEFT (filter != -LEFT) |
|
|
#define ALLOW_RIGHT (filter != -RIGHT) |
|
|
#define ALLOW_RIGHT (filter != -RIGHT) |
|
|
|
|
|
|
|
|
|
|
|
#define NOT_COLUMN_0 ((addr & 3) != 0) |
|
|
|
|
|
#define NOT_COLUMN_2 ((addr & 3) != 2) |
|
|
|
|
|
#define NOT_COLUMN_3 ((addr & 3) != 1) |
|
|
|
|
|
|
|
|
#define MOVE_UP (next_addr = addr + UP) |
|
|
#define MOVE_UP (next_addr = addr + UP) |
|
|
#define MOVE_DOWN (next_addr = addr + DOWN) |
|
|
#define MOVE_DOWN (next_addr = addr + DOWN) |
|
|
#define MOVE_LEFT (next_addr = addr + LEFT) |
|
|
#define MOVE_LEFT (next_addr = addr + LEFT) |
|
@ -18,54 +22,98 @@ cache_t cache[16]; |
|
|
#define TOP_LIMIT(ADDR) (addr >= ADDR * 3) |
|
|
#define TOP_LIMIT(ADDR) (addr >= ADDR * 3) |
|
|
#define BOTTOM_LIMIT(ADDR) (addr <= ADDR * 3) |
|
|
#define BOTTOM_LIMIT(ADDR) (addr <= ADDR * 3) |
|
|
|
|
|
|
|
|
#define NOT_COLUMN_0 ((addr & 3) != 0) |
|
|
#define release_1x1(FILTER) { \ |
|
|
#define NOT_COLUMN_2 ((addr & 3) != 2) |
|
|
|
|
|
#define NOT_COLUMN_3 ((addr & 3) != 1) |
|
|
|
|
|
|
|
|
|
|
|
//#define AT_COLUMN_0 ((addr & 3) == 0)
|
|
|
|
|
|
//#define AT_COLUMN_3 ((addr & 3) == 1)
|
|
|
|
|
|
|
|
|
|
|
|
#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 = F_1x1 << next_addr, \ |
|
|
.mask = F_1x1 << next_addr, \ |
|
|
.filter = _filter, \ |
|
|
.filter = FILTER, \ |
|
|
.addr = next_addr \ |
|
|
.addr = next_addr \ |
|
|
}; \ |
|
|
}; \ |
|
|
cache_insert(next_case); \ |
|
|
cache_insert(next_case); \ |
|
|
} |
|
|
} |
|
|
|
|
|
//
|
|
|
#define release_1x2(_filter) { \ |
|
|
//#define release_1x2(FILTER) { \ |
|
|
|
|
|
// cache_t next_case = { \ |
|
|
|
|
|
// .code = code & ~(F_1x2 << addr) | (C_1x2 << next_addr), \ |
|
|
|
|
|
// .mask = F_1x1 << next_addr, \ |
|
|
|
|
|
// .filter = FILTER, \ |
|
|
|
|
|
// .addr = next_addr \ |
|
|
|
|
|
// }; \ |
|
|
|
|
|
// cache_insert(next_case); \ |
|
|
|
|
|
//}
|
|
|
|
|
|
//
|
|
|
|
|
|
//#define release_2x1(FILTER) { \ |
|
|
|
|
|
// cache_t next_case = { \ |
|
|
|
|
|
// .code = code & ~(F_2x1 << addr) | (C_2x1 << next_addr), \ |
|
|
|
|
|
// .mask = F_1x1 << next_addr, \ |
|
|
|
|
|
// .filter = FILTER, \ |
|
|
|
|
|
// .addr = next_addr \ |
|
|
|
|
|
// }; \ |
|
|
|
|
|
// cache_insert(next_case); \ |
|
|
|
|
|
//}
|
|
|
|
|
|
//
|
|
|
|
|
|
//#define release_2x2(FILTER) { \ |
|
|
|
|
|
// cache_t next_case = { \ |
|
|
|
|
|
// .code = code & ~(F_2x2 << addr) | (C_2x2 << next_addr), \ |
|
|
|
|
|
// .mask = F_1x1 << next_addr, \ |
|
|
|
|
|
// .filter = FILTER, \ |
|
|
|
|
|
// .addr = next_addr \ |
|
|
|
|
|
// }; \ |
|
|
|
|
|
// cache_insert(next_case); \ |
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//#define release_1x1(FILTER) { \ |
|
|
|
|
|
// uint64_t next_code = code & ~(F_1x1 << addr) | (C_1x1 << next_addr); \ |
|
|
|
|
|
// bool flag = true; \ |
|
|
|
|
|
// auto *cache_p = cache; \ |
|
|
|
|
|
// for (; cache_p < cache + cache_size; ++cache_p) { \ |
|
|
|
|
|
// if (cache_p->code == next_code) { \ |
|
|
|
|
|
// flag = false; \ |
|
|
|
|
|
// break; \ |
|
|
|
|
|
// } \ |
|
|
|
|
|
// } \ |
|
|
|
|
|
// if (flag) { \ |
|
|
|
|
|
// *cache_p = { \ |
|
|
|
|
|
// .code = next_code, \ |
|
|
|
|
|
// .mask = F_1x1 << next_addr, \ |
|
|
|
|
|
// .filter = FILTER, \ |
|
|
|
|
|
// .addr = next_addr \ |
|
|
|
|
|
// }; \ |
|
|
|
|
|
// ++cache_size; \ |
|
|
|
|
|
// } \ |
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
#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 = F_1x1 << next_addr, \ |
|
|
.mask = F_1x1 << next_addr, \ |
|
|
.filter = _filter, \ |
|
|
.filter = FILTER, \ |
|
|
.addr = next_addr \ |
|
|
.addr = next_addr \ |
|
|
}; \ |
|
|
}; \ |
|
|
cache_insert(next_case); \ |
|
|
cache_insert(next_case); \ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#define release_2x1(_filter) { \ |
|
|
#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 = F_1x1 << next_addr, \ |
|
|
.mask = F_1x1 << next_addr, \ |
|
|
.filter = _filter, \ |
|
|
.filter = FILTER, \ |
|
|
.addr = next_addr \ |
|
|
.addr = next_addr \ |
|
|
}; \ |
|
|
}; \ |
|
|
cache_insert(next_case); \ |
|
|
cache_insert(next_case); \ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#define release_2x2(_filter) { \ |
|
|
#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 = F_1x1 << next_addr, \ |
|
|
.mask = F_1x1 << next_addr, \ |
|
|
.filter = _filter, \ |
|
|
.filter = FILTER, \ |
|
|
.addr = next_addr \ |
|
|
.addr = next_addr \ |
|
|
}; \ |
|
|
}; \ |
|
|
cache_insert(next_case); \ |
|
|
cache_insert(next_case); \ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
inline bool cache_insert(cache_t &new_item) { |
|
|
inline void cache_insert(cache_t &new_item) { |
|
|
|
|
|
|
|
|
// static int insert_num = 0;
|
|
|
// static int insert_num = 0;
|
|
|
// std::cout << "insert times: " << ++insert_num << std::endl;
|
|
|
// std::cout << "insert times: " << ++insert_num << std::endl;
|
|
@ -73,12 +121,11 @@ inline bool cache_insert(cache_t &new_item) { |
|
|
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) { |
|
|
return false; // already exist -> insert failed
|
|
|
return; // already exist -> insert failed
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
*p = new_item; |
|
|
*p = new_item; |
|
|
++cache_size; |
|
|
++cache_size; |
|
|
return true; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void move_1x1(uint64_t code, int addr) { |
|
|
void move_1x1(uint64_t code, int addr) { |
|
|