cxxrtl: keep the memory write queue sorted on insertion.
authorAsu <sdelang@sdelang.fr>
Wed, 22 Apr 2020 18:50:13 +0000 (20:50 +0200)
committerAsu <sdelang@sdelang.fr>
Wed, 22 Apr 2020 18:53:12 +0000 (20:53 +0200)
Strategically inserting the pending memory write in memory::update to keep the
queue sorted allows us to skip the queue sort in memory::commit.

The Minerva SRAM SoC runs ~7% faster as a result.

backends/cxxrtl/cxxrtl.h

index b79bbbc721c86baafd1203b2bc4d5be1fd66f977..701510b7f6589ef9c58b6bcb414464659983ef4a 100644 (file)
@@ -641,13 +641,15 @@ struct memory {
 
        void update(size_t index, const value<Width> &val, const value<Width> &mask, int priority = 0) {
                assert(index < data.size());
-               write_queue.emplace_back(write { index, val, mask, priority });
+               // Queue up the write while keeping the queue sorted by priority.
+               write_queue.insert(
+                       std::upper_bound(write_queue.begin(), write_queue.end(), priority,
+                               [](const int a, const write& b) { return a < b.priority; }),
+                       write { index, val, mask, priority });
        }
 
        bool commit() {
                bool changed = false;
-               std::sort(write_queue.begin(), write_queue.end(),
-                       [](const write &a, const write &b) { return a.priority < b.priority; });
                for (const write &entry : write_queue) {
                        value<Width> elem = data[entry.index];
                        elem = elem.update(entry.val, entry.mask);