From b62095815137b308a4457c20fec97ca9672c599a Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sat, 25 Jun 2022 12:54:33 -0700 Subject: Testing some actual support for destinations and custom steps. --- main.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 21 deletions(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index 0240bb5..25bd99b 100644 --- a/main.cpp +++ b/main.cpp @@ -9,11 +9,23 @@ int main(int argc, const char *argv[]) { std::cout << "Version " << GIT_TAG << "\n"; - aisa::Step step; - const_cast> &>(step.predicate) = std::optional(std::make_pair(123, 456)); - const_cast &>(step.source_regs).emplace_back(12); - const_cast &>(step.source_regs).emplace_back(34); - const_cast &>(step.source_regs).emplace_back(56); + struct CopyStep : public aisa::Step { + CopyStep(std::pair pred, const std::initializer_list> ®s) + { + predicate = std::move(pred); + source_regs.reserve(regs.size()); + destination_regs.reserve(regs.size()); + for (const auto &rp : regs) { + source_regs.emplace_back(rp.first); + destination_regs.emplace_back(rp.second); + } + } + + std::vector compute_destinations(const std::vector &source_vals) const override + { + return source_vals; + } + } step{{123, 456}, {{1, 2}, {3, 4}, {5, 6}}}; struct State : public aisa::EvalState { std::map regs; @@ -28,33 +40,42 @@ int main(int argc, const char *argv[]) std::cout << "(not available)\n"; return {}; } + + bool store_reg(aisa::regnum_t rn, aisa::regval_t rv) + { + std::cout << "state.store_reg(" << rn << " <- " << rv << ")\n"; + regs[rn] = rv; + return true; + } } state; auto t = state.async_load_reg(999); - t(); - t(); - t(); - std::cout << "set regs[999] = 54321\n"; state.regs[999] = 54321; + std::cout << "run\n"; t(); + std::cout << "run\n"; t(); + std::cout << "run\n"; t(); + std::cout << "set regs[999] = 54321\n"; state.store_reg(999, 54321); std::optional result; - while (!result.has_value()) + while (!result.has_value()) { + std::cout << "run\n"; result = t(); + } std::cout << "result = " << *result << "\n"; std::cout << "\n\n\n"; - auto w = step.evaluate(state); - w(); - w(); - w(); - std::cout << "set predicate (valid)\n"; state.regs[step.predicate->first] = step.predicate->second; - w(); - w(); - w(); + auto w = step.eval(state); + std::cout << "run\n"; w(); + std::cout << "run\n"; w(); + std::cout << "run\n"; w(); + std::cout << "set predicate (valid)\n"; state.store_reg(step.predicate->first, step.predicate->second); + std::cout << "run\n"; w(); + std::cout << "run\n"; w(); + std::cout << "run\n"; w(); std::cout << "set regs (all)\n"; - for (int i = 10; i < 100; ++i) - state.regs[i] = 1000 + i; + for (int i = 0; i < 10; ++i) + state.store_reg(i, 1000 + i); for (bool done = false; !done; done = w()) - ; + std::cout << "run\n"; std::cout << "huzzah!\n"; return 0; -- cgit v1.2.3