From 947c0ec0e9e66c3789d57e551fff49a7eb6a8974 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Tue, 10 Jan 2023 14:29:21 +0800 Subject: [PATCH] update: cache insert with cache_t --- src/core_demo.cc | 126 +++++++++++------------------------------------ src/core_demo.h | 4 +- 2 files changed, 30 insertions(+), 100 deletions(-) diff --git a/src/core_demo.cc b/src/core_demo.cc index 36ac096..14d4129 100644 --- a/src/core_demo.cc +++ b/src/core_demo.cc @@ -7,91 +7,23 @@ cache_t cache[16]; // TODO: use cache_t *move_cache_top? int cache_size; -inline bool cache_insert(uint64_t code) { - -// std::cout << "cache insert -> " << code << std::endl; +inline bool cache_insert(cache_t &new_item) { auto *p = cache; for (; p < cache + cache_size; ++p) { - if (p->code == code) { + if (p->code == new_item.code) { return false; // already exist -> insert failed } } -// *p = code; - p->code = code; -// p->filter = filter; - ++cache_size; - return true; -} - -inline bool cache_insert_demo(uint64_t code, int addr) { -// std::cout << "cache insert -> " << code << std::endl; + *p = new_item; - auto *p = cache; - for (; p < cache + cache_size; ++p) { - if (p->code == code) { -// std::cout << "insert failed" << std::endl; - return false; // already exist -> insert failed - } - } -// *p = code; - p->code = code; - p->addr = addr; -// p->filter = filter; ++cache_size; -// std::cout << "insert success" << std::endl; return true; } -/// input -> raw_code / block address -void move_1x1(uint64_t code, int addr) { - -// std::cout << "enter move_1x1 at " << addr << std::endl; - - int target_addr; - uint64_t ret_code; - - /// try to move up - if (addr >= 4 * 3 && !(code >> (target_addr = addr + UP) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - if (cache_insert(ret_code)) { - move_1x1(ret_code, target_addr); - } - } - - /// try to move down - if (addr <= 15 * 3 && !(code >> (target_addr = addr + DOWN) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - if (cache_insert(ret_code)) { - move_1x1(ret_code, target_addr); - } - } - - /// try to move left - if ((addr & 0b11) != 0 && !(code >> (target_addr = addr + LEFT) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - if (cache_insert(ret_code)) { - move_1x1(ret_code, target_addr); - } - } - - /// try to move right - if ((addr & 0x3) != 1 && !(code >> (target_addr = addr + RIGHT) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - if (cache_insert(ret_code)) { - move_1x1(ret_code, target_addr); - } - } -} - void move_1x1_demo(uint64_t code, int addr) { - - // start at cache[0] - // found -> insert into cache - // while count != cache_size - cache_size = 1; cache[0].code = code; cache[0].addr = addr; @@ -100,44 +32,44 @@ void move_1x1_demo(uint64_t code, int addr) { while (count != cache_size) { -// std::cout << "count = " << count; code = cache[count].code; addr = cache[count].addr; ++count; -// std::cout << " | code = " << code; -// std::cout << " | addr = " << addr << std::endl; - /// search code -> insert after cache - - int target_addr; uint64_t ret_code; -// if (code == 1027942792425096411) { -// std::cout << "match cache[1]" << std::endl; -// } + int next_addr; /// try to move up - if (addr >= 4 * 3 && !(code >> (target_addr = addr + UP) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - cache_insert_demo(ret_code, target_addr); + if (addr >= 4 * 3 && !(code >> (next_addr = addr + UP) & F_1x1)) { + ret_code = code & ~(F_1x1 << addr) | (C_1x1 << next_addr); + cache_t new_item = {ret_code, next_addr}; + cache_insert(new_item); + } /// try to move down - if (addr <= 15 * 3 && !(code >> (target_addr = addr + DOWN) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - cache_insert_demo(ret_code, target_addr); + if (addr <= 15 * 3 && !(code >> (next_addr = addr + DOWN) & F_1x1)) { + ret_code = code & ~(F_1x1 << addr) | (C_1x1 << next_addr); + cache_t new_item = {ret_code, next_addr}; + cache_insert(new_item); + } /// try to move left - if ((addr & 0b11) != 0 && !(code >> (target_addr = addr + LEFT) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - cache_insert_demo(ret_code, target_addr); + if ((addr & 0b11) != 0 && !(code >> (next_addr = addr + LEFT) & F_1x1)) { + ret_code = code & ~(F_1x1 << addr) | (C_1x1 << next_addr); + cache_t new_item = {ret_code, next_addr}; + cache_insert(new_item); + } /// try to move right - if ((addr & 0x3) != 1 && !(code >> (target_addr = addr + RIGHT) & F_1x1)) { - ret_code = code & ~(F_1x1 << addr) | C_1x1 << target_addr; - cache_insert_demo(ret_code, target_addr); + if ((addr & 0x3) != 1 && !(code >> (next_addr = addr + RIGHT) & F_1x1)) { + ret_code = code & ~(F_1x1 << addr) | (C_1x1 << next_addr); + cache_t new_item = {ret_code, next_addr}; + cache_insert(new_item); + } } @@ -151,8 +83,6 @@ void next_step(uint64_t raw_code, uint64_t mask) { // std::cout << RawCode(raw_code).dump_case(); // printf("mask -> %016lX\n", mask); - // case 1 -> 8.8s - for (int i = 0; i < 1000000000; ++i) { // cache_size = 1; // cache[0].code = raw_code; @@ -160,9 +90,9 @@ void next_step(uint64_t raw_code, uint64_t mask) { move_1x1_demo(raw_code, 17 * 3); } -// std::cout << cache_size << std::endl; -// std::cout << RawCode(cache[0].code).dump_case() << std::endl; -// std::cout << RawCode(cache[1].code).dump_case() << std::endl; -// std::cout << RawCode(cache[2].code).dump_case() << std::endl; + std::cout << cache_size << std::endl; + std::cout << RawCode(cache[0].code).dump_case() << std::endl; + std::cout << RawCode(cache[1].code).dump_case() << std::endl; + std::cout << RawCode(cache[2].code).dump_case() << std::endl; } diff --git a/src/core_demo.h b/src/core_demo.h index f1cb74c..69b11d2 100644 --- a/src/core_demo.h +++ b/src/core_demo.h @@ -11,8 +11,8 @@ struct cache_t { uint64_t code; // raw code - uint64_t mask; // only 000 or 111 - int filter; +// uint64_t mask; // only 000 or 111 +// int filter; int addr; };