From bcf2314f15d68d7a0b94445f99962342b9d4130d Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sat, 15 Oct 2022 15:01:25 -0700 Subject: Switch to external nanosim dependency. --- .gitignore | 1 + .gitmodules | 3 ++ Makefile | 11 +++++- infra/arbiter.h | 42 --------------------- infra/pipetrace.cpp | 9 ----- infra/pipetrace.h | 37 ------------------ infra/port.h | 45 ---------------------- infra/queue.h | 29 --------------- infra/sim.cpp | 9 ----- infra/sim.h | 38 ------------------- infra/stat.h | 35 ------------------ memory/dram.h | 96 ----------------------------------------------- memory/line.h | 15 -------- nanosim | 1 + pt | 105 +--------------------------------------------------- 15 files changed, 15 insertions(+), 461 deletions(-) create mode 100644 .gitmodules delete mode 100644 infra/arbiter.h delete mode 100644 infra/pipetrace.cpp delete mode 100644 infra/pipetrace.h delete mode 100644 infra/port.h delete mode 100644 infra/queue.h delete mode 100644 infra/sim.cpp delete mode 100644 infra/sim.h delete mode 100644 infra/stat.h delete mode 100644 memory/dram.h delete mode 100644 memory/line.h create mode 160000 nanosim mode change 100755 => 120000 pt diff --git a/.gitignore b/.gitignore index 796b96d..4a28f52 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +/.have_submodules /build diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..fd231f7 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "nanosim"] + path = nanosim + url = ../nanosim diff --git a/Makefile b/Makefile index f470f1b..2ffb7e0 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ XXD := xxd override CXXFLAGS += -std=c++20 -override COMPILE_FLAGS := -MMD -MP -I. +override COMPILE_FLAGS := -MMD -MP -I. -Inanosim override LINK_FLAGS := ifneq "$(strip $(PACKAGES))" "" @@ -30,9 +30,16 @@ clean: rm -rf $(BUILD) .PHONY: clean +.SECONDARY: .SUFFIXES: -override SOURCES := $(shell find -\( -name build -prune -\) -o -\( -name \*.cpp -print -\)) +.have_submodules: + git submodule update --init --recursive + @touch $@ + +-include .have_submodules + +override SOURCES := $(shell find * -\( -name build -prune -\) -o -\( -name \*.cpp -print -\)) override OBJECTS := $(addprefix $(BUILD)/, $(addsuffix .o, $(basename $(SOURCES)))) override DEPENDS := $(addprefix $(BUILD)/, $(addsuffix .d, $(basename $(SOURCES)))) diff --git a/infra/arbiter.h b/infra/arbiter.h deleted file mode 100644 index 5dd1647..0000000 --- a/infra/arbiter.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "infra/sim.h" - -namespace infra { - template struct priority_arbiter : public sim { - std::array, peers> peerp; - port *outp = nullptr; - - void clock() { - for (unsigned int i = 0; i < peers; ++i) { - if (outp->can_write() && peerp[i].can_read()) - outp->write(peerp[i].read()); - } - } - }; - - template struct round_robin_arbiter : public sim { - std::array, peers> peerp; - port *outp = nullptr; - unsigned int initial = 0; - - void clock() { - bool initially_empty = outp->can_write(); - for (unsigned int i = initial; i < peers; ++i) { - if (outp->can_write() && peerp[i].can_read()) - outp->write(peerp[i].read()); - } - for (unsigned int i = 0; i < initial; ++i) { - if (outp->can_write() && peerp[i].can_read()) - outp->write(peerp[i].read()); - } - if (initially_empty && !outp->can_write()) - if (++initial == peers) - initial = 0; - } - }; -} diff --git a/infra/pipetrace.cpp b/infra/pipetrace.cpp deleted file mode 100644 index e6642ef..0000000 --- a/infra/pipetrace.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -#include "infra/pipetrace.h" - -namespace infra { - std::ostream *pt::ptfile = nullptr; - std::uint64_t pt::next_record = 0; -} diff --git a/infra/pipetrace.h b/infra/pipetrace.h deleted file mode 100644 index 656b9b9..0000000 --- a/infra/pipetrace.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace infra { - struct transaction { - std::uint64_t record = ~(std::uint64_t)0; - }; - - struct pt { - static std::ostream *ptfile; - - static std::uint64_t next_record; - - static transaction toplevel() { - transaction t; - t.record = next_record++; - return t; - } - - static transaction child(const transaction &p) { - transaction t; - t.record = next_record++; - if (ptfile) - *ptfile << fmt::format("{} parent {}\n", t.record, p.record); - return t; - } - - static void event(const transaction &t, const char *event, std::uint64_t time, const std::string &data) { - if (ptfile) - *ptfile << fmt::format("@{} {} {} {}\n", time, t.record, event, data); - } - }; -} diff --git a/infra/port.h b/infra/port.h deleted file mode 100644 index 06a3aa5..0000000 --- a/infra/port.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "infra/sim.h" - -namespace infra { - template struct port : public sim { - std::optional consumer_side; - std::optional producer_side; - - bool can_read() { return consumer_side.has_value(); } - bool can_write() { return !producer_side.has_value(); } - - T read() { - assert(can_read()); - auto x = std::move(*consumer_side); - consumer_side.reset(); - return x; - } - - const T & peek() { - assert(can_read()); - return *consumer_side; - } - - void discard() { - consumer_side.reset(); - } - - void write(T &&x) { - assert(can_write()); - producer_side = std::move(x); - } - - void unclock() { - if (!consumer_side && producer_side) { - consumer_side = std::move(*producer_side); - producer_side.reset(); - } - } - }; -} diff --git a/infra/queue.h b/infra/queue.h deleted file mode 100644 index 1e490bc..0000000 --- a/infra/queue.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "infra/port.h" -#include "infra/sim.h" - -namespace infra { - template struct queue : public sim { - port input; - port *output = nullptr; - std::deque elements; - - void clock() { - if (input.can_read() && elements.size() < size) { - auto x = input.read(); - elements.emplace_back(std::move(x)); - } - if (output->can_write() && !elements.empty()) { - auto &x = elements.front(); - output->write(std::move(x)); - elements.pop_front(); - } - } - }; -} diff --git a/infra/sim.cpp b/infra/sim.cpp deleted file mode 100644 index 21acc8c..0000000 --- a/infra/sim.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -#include "infra/sim.h" - -namespace infra { - std::vector sim::sims; - std::uint64_t sim::now = 0; -} diff --git a/infra/sim.h b/infra/sim.h deleted file mode 100644 index 185916a..0000000 --- a/infra/sim.h +++ /dev/null @@ -1,38 +0,0 @@ -#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); - } - }; -} diff --git a/infra/stat.h b/infra/stat.h deleted file mode 100644 index f1ca75a..0000000 --- a/infra/stat.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include -#include - -#include "infra/sim.h" - -namespace infra { - struct stat : public sim { - std::string name; - std::uint64_t numerator = 0; - std::uint64_t denominator = 0; - - stat(std::string name) - : name(std::move(name)) - { } - - ~stat() { - fmt::print("# {} {}\n", name, (double)numerator/(double)denominator); - } - - void unclock() { - ++denominator; - } - - stat & operator++() { - ++numerator; - return *this; - } - - stat & operator++(int) { - return operator++(); - } - }; -} diff --git a/memory/dram.h b/memory/dram.h deleted file mode 100644 index f59c7a6..0000000 --- a/memory/dram.h +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#include "memory/line.h" - -namespace memory { - struct dram : public infra::sim { - static constexpr std::uint64_t PAGE_LINES_LOG2 = 20 - LINE_BYTES_LOG2; - static constexpr std::uint64_t PAGE_LINES = 1 << PAGE_LINES_LOG2; - static constexpr std::uint64_t PAGE_LINE_OFFSET_MASK = PAGE_LINES - 1; - static constexpr std::uint64_t PAGE_BYTES_LOG2 = PAGE_LINES_LOG2 + LINE_BYTES_LOG2; - static constexpr std::uint64_t PAGE_BYTES = 1 << PAGE_BYTES_LOG2; - static constexpr std::uint64_t PAGE_BYTE_OFFSET_MASK = PAGE_BYTES - 1; - - typedef std::array page; - - std::map image; - - struct response { - infra::transaction transaction; - std::uint64_t line_address; - line data; - }; - - struct command { - infra::transaction transaction; - std::uint64_t line_address; - line data; - std::array mask; - bool write = false; - infra::port *responsep = nullptr; - }; - - infra::port commandp; - - void clock() { - if (commandp.can_read()) { - const auto &c = commandp.peek(); - if (!c.responsep || c.responsep->can_write()) { - auto page_address = c.line_address >> PAGE_LINES_LOG2; - auto page_line = c.line_address & PAGE_LINE_OFFSET_MASK; - if (c.write) { - pte(c.transaction, "s", fmt::format("store {:x}-{:x}", page_address, page_line)); - if (c.responsep) { - response r; - r.transaction = c.transaction; - r.line_address = c.line_address; - r.data = c.data; - c.responsep->write(std::move(r)); - } - auto [p, emplaced] = image.try_emplace(page_address); - if (emplaced) - for (unsigned int i = 0; i < PAGE_LINES; ++i) - p->second[i].fill(0); - auto &l = p->second[page_line]; - for (unsigned int i = 0; i < LINE_BYTES; ++i) - if (c.mask[i]) - l[i] = c.data[i]; - } else { - pte(c.transaction, "f", fmt::format("fill {:x}-{:x}", page_address, page_line)); - if (c.responsep) { - response r; - r.transaction = c.transaction; - r.line_address = c.line_address; - if (auto p = image.find(page_address); p != image.end()) - r.data = p->second[page_line]; - else - r.data.fill(0); - c.responsep->write(std::move(r)); - } - } - commandp.discard(); - } - } - } - - void load(std::istream &fh) { - for (unsigned int page = 0; ; ++page) { - auto [p, emplaced] = image.try_emplace(page); - if (emplaced) - for (unsigned int i = 0; i < PAGE_LINES; ++i) - p->second[i].fill(0); - for (unsigned int line = 0; line < PAGE_LINES; ++line) - if (!fh.read(reinterpret_cast(p->second[line].data()), LINE_BYTES)) - return; - } - } - }; -} diff --git a/memory/line.h b/memory/line.h deleted file mode 100644 index 3377ec8..0000000 --- a/memory/line.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include - -#include "infra/port.h" -#include "infra/sim.h" - -namespace memory { - constexpr std::uint64_t LINE_BYTES_LOG2 = 4; - constexpr std::uint64_t LINE_BYTES = 1 << LINE_BYTES_LOG2; - constexpr std::uint64_t LINE_BYTE_OFFSET_MASK = LINE_BYTES - 1; - - typedef std::array line; -} diff --git a/nanosim b/nanosim new file mode 160000 index 0000000..f795e6c --- /dev/null +++ b/nanosim @@ -0,0 +1 @@ +Subproject commit f795e6c7224c0cdeedb0c2a7bccc8cae89913153 diff --git a/pt b/pt deleted file mode 100755 index 206795f..0000000 --- a/pt +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/ruby - -$filter = ARGV - -$parents = {} -$events = {} -$has = {} -$data = {} -$horiz = {} -$maxtime = -1 - -$stats = false - -$stdin.each_line do | line | - case line - - when /^(\d+) parent (\d+)$/ - child = $1.to_i - parent = $2.to_i - $parents[child] = parent - - when /^@(\d+) (\d+) (\S*) (.*)$/ - time = $1.to_i - rec = $2.to_i - event = $3 - data = $4 - if event.size > 0 - $events[rec] ||= {} - $events[rec][time] = event - $has[rec] ||= {} - $has[rec][event] = true - $horiz[event] ||= "" - $horiz[event] = $horiz[event].ljust(time) - $horiz[event][time] = event - end - if data.size > 0 - $data[rec] ||= "" - $data[rec] += " #{event}@#{time}:" if event.size > 0 - $data[rec] += " #{data}" - end - $maxtime = [$maxtime, time+1].max - - when /^#\s*(.*)$/ - $stats = true - $stdout.write("#{$1}\n") - - else - raise "Unexpected line: #{line}" - end -end - -$stdout.write("\n") if $stats - -$hier = {} -$hier_direct = {} - -$events.each_key do | rec | - subhier = {} - $hier_direct[rec] = subhier - if $parents.key?(rec) - $hier_direct[$parents[rec]][rec] = subhier - else - $hier[rec] = subhier - end -end - -$order = [] - -def flatten(hier) - hier.each do | rec, subhier | - $order << rec - flatten(subhier) - end -end -flatten($hier) - -rwidth = $order.map { | x | x.to_s.size }.max - -$horiz.keys.sort.each do | occ | - $stdout.write(" " * rwidth + " #{$horiz[occ].ljust($maxtime)}") - count = $horiz[occ].delete(" ").size - $stdout.write(" #{($maxtime.to_f / count.to_f).round(2).to_s.rjust(5)} cyc/evt\n") -end -$stdout.write("\n") - -mwidth = 0 - -$order.each do | rec | - estr = "" - filter_match = $filter.empty? - $has[rec].each_key do | event | - filter_match ||= $filter.include?(event) - end - next unless filter_match - $events[rec].keys.sort.each do | time | - estr = estr.ljust(time + 1, estr.size == 0 ? " " : "-") - estr[time] = $events[rec][time] if $events[rec][time].size > 0 - end - estr += " " * 5 - estr = estr.ljust(mwidth - 1) - estr = estr.ljust(estr.size + 20 - estr.size % 20) - mwidth = [mwidth, estr.size].max - $stdout.write(rec.to_s.rjust(rwidth) + ": #{estr}#{$data[rec]}\n") -end diff --git a/pt b/pt new file mode 120000 index 0000000..d6f3bd4 --- /dev/null +++ b/pt @@ -0,0 +1 @@ +nanosim/pt \ No newline at end of file -- cgit v1.2.3