Skip to content

Commit e07f7de

Browse files
authored
Merge pull request #113 from mjcaisse/fix-mmio-bus
🐛 Update mmio_bus read/write with regname
2 parents 46881d2 + 2e8cd52 commit e07f7de

File tree

3 files changed

+32
-25
lines changed

3 files changed

+32
-25
lines changed

.github/workflows/asciidoctor-ghpages.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242

4343
- name: Install Mermaid
4444
run: |
45-
npm install -g @mermaid-js/mermaid-cli@11.4.2
45+
npm install -g @mermaid-js/mermaid-cli@11.12.0
4646
npx puppeteer browsers install chrome-headless-shell
4747
4848
- name: Install asciidoctor

include/groov/mmio_bus.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <async/just_result_of.hpp>
88
#include <async/then.hpp>
99

10+
#include <stdx/ct_string.hpp>
11+
1012
#include <boost/mp11/algorithm.hpp>
1113
#include <boost/mp11/integral.hpp>
1214
#include <boost/mp11/list.hpp>
@@ -100,7 +102,8 @@ struct cpp_mem_iface {
100102
template <typename HardwareInterface = cpp_mem_iface> struct mmio_bus {
101103
using iface = HardwareInterface;
102104

103-
template <auto Mask, decltype(Mask) IdMask, decltype(Mask) IdValue>
105+
template <stdx::ct_string, auto Mask, decltype(Mask) IdMask,
106+
decltype(Mask) IdValue>
104107
requires std::unsigned_integral<decltype(Mask)>
105108
static auto write(auto addr, decltype(Mask) value) -> async::sender auto {
106109
static_assert((Mask & IdMask) == decltype(Mask){});
@@ -144,7 +147,7 @@ template <typename HardwareInterface = cpp_mem_iface> struct mmio_bus {
144147
}
145148
}
146149

147-
template <std::unsigned_integral auto Mask>
150+
template <stdx::ct_string, std::unsigned_integral auto Mask>
148151
static auto read(auto addr) -> async::sender auto {
149152
using base_type = decltype(Mask);
150153
return iface::template load<base_type>(addr);

test/mmio_bus.cpp

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ TEST_CASE("subword write optimization", "[mmio_bus]") {
4646
iface::num_loads = {};
4747

4848
SECTION("write the whole register") {
49-
CHECK(bus::write<0xffff'ffffu, 0u, 0u>(addr32, 0xc001'd00du) |
49+
CHECK(bus::write<"", 0xffff'ffffu, 0u, 0u>(addr32, 0xc001'd00du) |
5050
async::sync_wait());
5151

5252
CHECK(iface::num_stores == 1);
@@ -55,15 +55,16 @@ TEST_CASE("subword write optimization", "[mmio_bus]") {
5555
}
5656

5757
SECTION("write byte 0") {
58-
CHECK(bus::write<0xffu, 0u, 0u>(addr32, 0x38u) | async::sync_wait());
58+
CHECK(bus::write<"", 0xffu, 0u, 0u>(addr32, 0x38u) |
59+
async::sync_wait());
5960

6061
CHECK(iface::num_stores == 1);
6162
CHECK(iface::num_loads == 0);
6263
CHECK(reg32 == 0x8765'4338u);
6364
}
6465

6566
SECTION("write byte 1") {
66-
CHECK(bus::write<0xff00u, 0u, 0u>(addr32, 0x4200u) |
67+
CHECK(bus::write<"", 0xff00u, 0u, 0u>(addr32, 0x4200u) |
6768
async::sync_wait());
6869

6970
CHECK(iface::num_stores == 1);
@@ -72,7 +73,7 @@ TEST_CASE("subword write optimization", "[mmio_bus]") {
7273
}
7374

7475
SECTION("write byte 2") {
75-
CHECK(bus::write<0xff'0000u, 0u, 0u>(addr32, 0x55'0000u) |
76+
CHECK(bus::write<"", 0xff'0000u, 0u, 0u>(addr32, 0x55'0000u) |
7677
async::sync_wait());
7778

7879
CHECK(iface::num_stores == 1);
@@ -81,7 +82,7 @@ TEST_CASE("subword write optimization", "[mmio_bus]") {
8182
}
8283

8384
SECTION("write byte 3") {
84-
CHECK(bus::write<0xff00'0000u, 0u, 0u>(addr32, 0x1300'0000u) |
85+
CHECK(bus::write<"", 0xff00'0000u, 0u, 0u>(addr32, 0x1300'0000u) |
8586
async::sync_wait());
8687

8788
CHECK(iface::num_stores == 1);
@@ -90,7 +91,7 @@ TEST_CASE("subword write optimization", "[mmio_bus]") {
9091
}
9192

9293
SECTION("write word at offset 0") {
93-
CHECK(bus::write<0xffffu, 0u, 0u>(addr32, 0xd00du) |
94+
CHECK(bus::write<"", 0xffffu, 0u, 0u>(addr32, 0xd00du) |
9495
async::sync_wait());
9596

9697
CHECK(iface::num_stores == 1);
@@ -99,7 +100,7 @@ TEST_CASE("subword write optimization", "[mmio_bus]") {
99100
}
100101

101102
SECTION("write word at offset 2") {
102-
CHECK(bus::write<0xffff'0000u, 0u, 0u>(addr32, 0x6502'0000u) |
103+
CHECK(bus::write<"", 0xffff'0000u, 0u, 0u>(addr32, 0x6502'0000u) |
103104
async::sync_wait());
104105

105106
CHECK(iface::num_stores == 1);
@@ -114,15 +115,15 @@ TEST_CASE("read-modify-write", "[mmio_bus]") {
114115
iface::num_loads = {};
115116

116117
SECTION("write a single bit") {
117-
CHECK(bus::write<0x1u, 0u, 0u>(addr32, 0u) | async::sync_wait());
118+
CHECK(bus::write<"", 0x1u, 0u, 0u>(addr32, 0u) | async::sync_wait());
118119

119120
CHECK(iface::num_stores == 1);
120121
CHECK(iface::num_loads == 1);
121122
CHECK(reg32 == 0xffff'fffeu);
122123
}
123124

124125
SECTION("write a nibble") {
125-
CHECK(bus::write<0xf000u, 0u, 0u>(addr32, 0x7000u) |
126+
CHECK(bus::write<"", 0xf000u, 0u, 0u>(addr32, 0x7000u) |
126127
async::sync_wait());
127128

128129
CHECK(iface::num_stores == 1);
@@ -137,23 +138,25 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
137138
iface::num_loads = {};
138139

139140
SECTION("write bit in byte 0") {
140-
CHECK(bus::write<0x1u, 0xffff'fffeu, 0xffff'fffeu>(addr32, 0u) |
141+
CHECK(bus::write<"", 0x1u, 0xffff'fffeu, 0xffff'fffeu>(addr32, 0u) |
141142
async::sync_wait());
142143

143144
CHECK(iface::num_stores == 1);
144145
CHECK(iface::num_loads == 0);
145146
CHECK(reg32 == 0xffff'fffeu);
146147
}
147148
SECTION("write bit in byte 0 - requires subword write") {
148-
CHECK(bus::write<0x1u, 0xfeu, 0xfeu>(addr32, 0u) | async::sync_wait());
149+
CHECK(bus::write<"", 0x1u, 0xfeu, 0xfeu>(addr32, 0u) |
150+
async::sync_wait());
149151

150152
CHECK(iface::num_stores == 1);
151153
CHECK(iface::num_loads == 0);
152154
CHECK(reg32 == 0xffff'fffeu);
153155
}
154156

155157
SECTION("write nibble in byte 1") {
156-
CHECK(bus::write<0x0f00u, 0xffff'f0ffu, 0xffff'f0ffu>(addr32, 0x0300u) |
158+
CHECK(bus::write<"", 0x0f00u, 0xffff'f0ffu, 0xffff'f0ffu>(addr32,
159+
0x0300u) |
157160
async::sync_wait());
158161

159162
CHECK(iface::num_stores == 1);
@@ -162,7 +165,7 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
162165
}
163166

164167
SECTION("write nibble in byte 1 - requires subword write") {
165-
CHECK(bus::write<0x0f00u, 0xf0ffu, 0xf0ffu>(addr32, 0x0300u) |
168+
CHECK(bus::write<"", 0x0f00u, 0xf0ffu, 0xf0ffu>(addr32, 0x0300u) |
166169
async::sync_wait());
167170

168171
CHECK(iface::num_stores == 1);
@@ -171,7 +174,7 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
171174
}
172175

173176
SECTION("write across two bytes - requires subword write") {
174-
CHECK(bus::write<0x0ff0u, 0xf00fu, 0xf00fu>(addr32, 0x0340u) |
177+
CHECK(bus::write<"", 0x0ff0u, 0xf00fu, 0xf00fu>(addr32, 0x0340u) |
175178
async::sync_wait());
176179

177180
CHECK(iface::num_stores == 1);
@@ -180,8 +183,8 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
180183
}
181184

182185
SECTION("write nibble in byte 2") {
183-
CHECK(bus::write<0xf0'0000u, 0xff0f'ffffu, 0xff0f'ffffu>(addr32,
184-
0x40'0000u) |
186+
CHECK(bus::write<"", 0xf0'0000u, 0xff0f'ffffu, 0xff0f'ffffu>(
187+
addr32, 0x40'0000u) |
185188
async::sync_wait());
186189

187190
CHECK(iface::num_stores == 1);
@@ -190,7 +193,7 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
190193
}
191194

192195
SECTION("write nibble in byte 3") {
193-
CHECK(bus::write<0x0f00'0000u, 0xf0ff'ffffu, 0xf0ff'ffffu>(
196+
CHECK(bus::write<"", 0x0f00'0000u, 0xf0ff'ffffu, 0xf0ff'ffffu>(
194197
addr32, 0x1300'0000u) |
195198
async::sync_wait());
196199

@@ -200,8 +203,8 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
200203
}
201204

202205
SECTION("write across three bytes") {
203-
CHECK(bus::write<0xff'ffffu, 0xff00'0000u, 0xff00'0000u>(addr32,
204-
0x41'd00du) |
206+
CHECK(bus::write<"", 0xff'ffffu, 0xff00'0000u, 0xff00'0000u>(
207+
addr32, 0x41'd00du) |
205208
async::sync_wait());
206209

207210
CHECK(iface::num_stores == 1);
@@ -210,16 +213,17 @@ TEST_CASE("idmask write optimization", "[mmio_bus]") {
210213
}
211214

212215
SECTION("write across three bytes - check id bit write") {
213-
CHECK(bus::write<0x00ff'ffffu, 0xff00'0000u, 0u>(addr32, 0x41'd00du) |
214-
async::sync_wait());
216+
CHECK(
217+
bus::write<"", 0x00ff'ffffu, 0xff00'0000u, 0u>(addr32, 0x41'd00du) |
218+
async::sync_wait());
215219

216220
CHECK(iface::num_stores == 1);
217221
CHECK(iface::num_loads == 0);
218222
CHECK(reg32 == 0x0041'd00du);
219223
}
220224

221225
SECTION("write across three bytes - start at byte 1") {
222-
CHECK(bus::write<0xffff'ff00u, 0x0000'00ffu, 0x0000'00ffu>(
226+
CHECK(bus::write<"", 0xffff'ff00u, 0x0000'00ffu, 0x0000'00ffu>(
223227
addr32, 0x41d0'0d00u) |
224228
async::sync_wait());
225229

0 commit comments

Comments
 (0)