#pragma once #include #include #include #include "infra/pipetrace.h" namespace infra { struct sim { virtual void clock() {} virtual void unclock() {} static std::vector sims; static std::uint64_t now; sim() { sims.emplace_back(this); } virtual ~sim() { std::erase(sims, this); } static void advance() { for (auto &s : sims) s->clock(); for (auto &s : sims) s->unclock(); ++now; } void pte(const transaction &t, const char *event, const std::string &data) { pt::event(t, event, now, data); } }; }