Skip to content

Commit b495faa

Browse files
committed
test: use meta concept construction macros
1 parent b31b6c4 commit b495faa

File tree

5 files changed

+101
-144
lines changed

5 files changed

+101
-144
lines changed

dv/BaudRateGen/BaudRateGen.cpp

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,6 @@
66
#include <TestHelpers.hpp>
77
#include <VBaudRateGen.h>
88

9-
static constexpr unsigned flog2(unsigned x) {
10-
return x == 1 ? 0 : flog2(x >> 1) + 1;
11-
}
12-
13-
static constexpr unsigned clog2(unsigned x) {
14-
return x == 1 ? 0 : flog2(x - 1) + 1;
15-
}
16-
17-
constexpr unsigned MaxClockRate = 100 * 1000000;
18-
constexpr unsigned MinBaudRate = 9600;
19-
constexpr unsigned Oversample = 16;
20-
21-
constexpr unsigned rxRate = MaxClockRate / (MinBaudRate * Oversample);
22-
constexpr unsigned txRate = MaxClockRate / MinBaudRate;
23-
24-
constexpr unsigned txWidth = clog2(txRate);
25-
constexpr unsigned rxShift = clog2(Oversample);
26-
constexpr unsigned rxWidth = txWidth - rxShift;
27-
28-
template <typename Dut, typename Phase = int, typename Rate = decltype(txRate),
29-
typename SyncReset = int>
30-
requires can_phase_reset<Dut, Phase, Rate, SyncReset> &&
31-
nyu::reset_default_ok<Dut>
32-
void tag_invoke(nyu::reset_t, Dut& dut, Phase phase = 0,
33-
Rate rate =
34-
txRate) noexcept(nothrow_can_phase_reset<Dut, Phase, Rate, SyncReset> &&
35-
nyu::nothrow_reset_default_ok<Dut>) {
36-
dut.phase = static_cast<bool>(phase);
37-
dut.rate = rate;
38-
dut.syncReset = SyncReset {0};
39-
nyu::reset_default(dut);
40-
}
41-
429
TEST_CASE("BaudRateGen, Reset") {
4310
auto& rg {nyu::get_dut_catch2<VBaudRateGen>()};
4411
nyu::reset(rg, 0);

dv/TestHelpers.hpp

Lines changed: 98 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,126 @@
1-
#ifndef TEST_CUSTOMIZATIONS_HPP
2-
#define TEST_CUSTOMIZATIONS_HPP
1+
#ifndef TEST_HELPERS_HPP
2+
#define TEST_HELPERS_HPP
33

4-
#include <NyuCatch2TestUtil.hpp>
4+
#include <cstdint>
55

6-
template <typename T, typename R = int>
7-
concept has_en_assign_from = requires(T t, R r) { t.en = r; };
6+
#include <NyuTestUtil.hpp>
87

9-
template <typename T, typename R = int>
10-
concept nothrow_has_en_assign_from = requires(T t, R r) {
11-
{ t.en = r } noexcept;
12-
};
8+
consteval unsigned flog2(unsigned x) {
9+
return x == 1 ? 0 : flog2(x >> 1) + 1;
10+
}
1311

14-
template <typename Dut, typename R = int>
15-
requires has_en_assign_from<Dut, R> && nyu::reset_default_ok<Dut>
16-
void tag_invoke(nyu::reset_t, Dut& dut) noexcept(
17-
nothrow_has_en_assign_from<Dut, R> && nyu::nothrow_reset_default_ok<Dut>) {
18-
dut.en = R {1};
19-
nyu::reset_default(dut);
12+
consteval unsigned clog2(unsigned x) {
13+
return x == 1 ? 0 : flog2(x - 1) + 1;
2014
}
2115

22-
template <typename T, typename R = bool>
23-
concept has_phase_assign_from =
24-
requires(T t, R r) { t.phase = static_cast<bool>(r); };
16+
inline constexpr unsigned MaxClockRate = 100 * 1000000;
17+
inline constexpr unsigned MinBaudRate = 9600;
18+
inline constexpr unsigned Oversample = 16;
2519

26-
template <typename T, typename R = bool>
27-
concept nothrow_has_phase_assign_from = requires(T t, R r) {
28-
{ t.phase = static_cast<bool>(r) } noexcept;
29-
};
20+
inline constexpr unsigned rxRate = MaxClockRate / (MinBaudRate * Oversample);
21+
inline constexpr unsigned txRate = MaxClockRate / MinBaudRate;
3022

31-
template <typename T, typename R = int>
32-
concept has_rate_assign_from = requires(T t, R r) { t.rate = r; };
23+
inline constexpr unsigned txWidth = clog2(txRate);
24+
inline constexpr unsigned rxShift = clog2(Oversample);
25+
inline constexpr unsigned rxWidth = txWidth - rxShift;
3326

34-
template <typename T, typename R = int>
35-
concept nothrow_has_rate_assign_from = requires(T t, R r) {
36-
{ t.rate = r } noexcept;
37-
};
3827

39-
template <typename T, typename R = int>
40-
concept has_syncReset_assign_from = requires(T t, R r) { t.syncReset = r; };
28+
NYU_META_ASSIGNABLE_CONCEPTS(has_en_assign_from, en)
29+
NYU_META_ASSIGNABLE_CONCEPTS(has_in_assign_from, in)
30+
NYU_META_ASSIGNABLE_CONCEPTS(has_phase_assign_from, phase)
31+
NYU_META_ASSIGNABLE_CONCEPTS(has_rate_assign_from, rate)
32+
NYU_META_ASSIGNABLE_CONCEPTS(has_syncreset_assign_from, syncReset)
33+
NYU_META_ASSIGNABLE_CONCEPTS(has_data_assign_from, data)
34+
NYU_META_ASSIGNABLE_CONCEPTS(has_valid_assign_from, valid)
4135

42-
template <typename T, typename R = int>
43-
concept nothrow_has_syncReset_assign_from = requires(T t, R r) {
44-
{ t.syncReset = r } noexcept;
45-
};
4636

47-
template <typename Dut, typename Phase = bool, typename Rate = int,
48-
typename SyncReset = int>
37+
template <typename Dut, typename R = std::uint8_t>
38+
requires has_en_assign_from<Dut, R> && nyu::reset_default_ok<Dut>
39+
void tag_invoke(nyu::reset_t, Dut& dut) noexcept(
40+
nothrow_has_en_assign_from<Dut, R> && nyu::nothrow_reset_default_ok<Dut>) {
41+
dut.en = R {1};
42+
nyu::reset_default(dut);
43+
}
44+
45+
46+
template <typename Dut, typename Phase, typename Rate, typename SyncReset>
4947
concept can_phase_reset =
5048
has_phase_assign_from<Dut, Phase> && has_rate_assign_from<Dut, Rate> &&
51-
has_syncReset_assign_from<Dut, SyncReset>;
49+
has_syncreset_assign_from<Dut, SyncReset>;
5250

53-
template <typename Dut, typename Phase = bool, typename Rate = int,
54-
typename SyncReset = int>
51+
template <typename Dut, typename Phase, typename Rate, typename SyncReset>
5552
concept nothrow_can_phase_reset = nothrow_has_phase_assign_from<Dut, Phase> &&
5653
nothrow_has_rate_assign_from<Dut, Rate> &&
57-
nothrow_has_syncReset_assign_from<Dut, SyncReset>;
58-
59-
template <typename T, typename R = int>
60-
concept has_data_assign_from = requires(T t, R r) { t.data = r; };
61-
62-
template <typename T, typename R = int>
63-
concept nothrow_has_data_assign_from = requires(T t, R r) {
64-
{ t.data = r } noexcept;
65-
};
66-
67-
template <typename T, typename R = int>
68-
concept has_valid_assign_from = requires(T t, R r) { t.valid = r; };
54+
nothrow_has_syncreset_assign_from<Dut, SyncReset>;
55+
56+
template <typename Dut, typename Phase = int, typename Rate = decltype(txRate),
57+
typename SyncReset = std::uint8_t>
58+
requires can_phase_reset<Dut, Phase, Rate, SyncReset> &&
59+
nyu::reset_default_ok<Dut>
60+
void tag_invoke(nyu::reset_t, Dut& dut, Phase phase = 0,
61+
Rate rate =
62+
txRate) noexcept(nothrow_can_phase_reset<Dut, Phase, Rate, SyncReset> &&
63+
nyu::nothrow_reset_default_ok<Dut>) {
64+
dut.phase = static_cast<bool>(phase);
65+
dut.rate = rate;
66+
dut.syncReset = SyncReset {0};
67+
nyu::reset_default(dut);
68+
}
6969

70-
template <typename T, typename R = int>
71-
concept nothrow_has_valid_assign_from = requires(T t, R r) {
72-
{ t.valid = r } noexcept;
73-
};
7470

75-
template <typename Dut, typename Data = int, typename Valid = int>
71+
template <typename Dut, typename Data, typename Valid>
7672
concept can_send = has_data_assign_from<Dut, Data> &&
7773
has_valid_assign_from<Dut, Data> && nyu::can_call_tick<Dut>;
7874

79-
template <typename Dut, typename Data = int, typename Valid = int>
75+
template <typename Dut, typename Data, typename Valid>
8076
concept nothrow_can_send = nothrow_has_data_assign_from<Dut, Data> &&
8177
nothrow_has_valid_assign_from<Dut, Data> && nyu::nothrow_can_call_tick<Dut>;
8278

83-
template <typename Dut, typename Data, typename Valid = int>
79+
template <typename Dut, typename Data, typename Valid = std::uint8_t>
8480
requires can_send<Dut, Data, Valid>
85-
void send(Dut& tx, Data val) noexcept(nothrow_can_send<Dut, Data, Valid>) {
86-
tx.data = val;
87-
tx.valid = Valid {1};
88-
nyu::tick(tx);
89-
tx.valid = Valid {0};
81+
void send(Dut& dut, Data val) noexcept(nothrow_can_send<Dut, Data, Valid>) {
82+
dut.data = val;
83+
dut.valid = Valid {1};
84+
nyu::tick(dut);
85+
dut.valid = Valid {0};
86+
}
87+
88+
89+
template <typename Dut, typename In>
90+
concept can_start_transmit =
91+
has_in_assign_from<Dut, In> && nyu::can_call_tick<Dut>;
92+
93+
template <typename Dut, typename In>
94+
concept nothrow_can_start_transmit =
95+
nothrow_has_in_assign_from<Dut, In> && nyu::nothrow_can_call_tick<Dut>;
96+
97+
template <typename Dut, typename In = std::uint8_t>
98+
requires can_start_transmit<Dut, In>
99+
void start(Dut& dut, unsigned ticks = Oversample) noexcept(
100+
nothrow_can_start_transmit<Dut, In>) {
101+
dut.in = In {1};
102+
nyu::tick(dut);
103+
dut.in = In {0};
104+
nyu::tick(dut, ticks);
105+
}
106+
107+
template <typename Dut, typename In = std::uint8_t>
108+
requires can_start_transmit<Dut, In>
109+
void transmit(Dut& dut, std::uint8_t val, unsigned ticks = Oversample) noexcept(
110+
nothrow_can_start_transmit<Dut, In>) {
111+
for(unsigned i {0}; i < 8; ++i) {
112+
dut.in = static_cast<In>(val & 0x1);
113+
nyu::tick(dut, ticks);
114+
val >>= 1;
115+
}
90116
}
91117

92-
#endif // TEST_CUSTOMIZATIONS_HPP
118+
template <typename Dut, typename In = std::uint8_t>
119+
requires can_start_transmit<Dut, In>
120+
void start_transmit(Dut& dut, std::uint8_t val) {
121+
start<Dut, In>(dut);
122+
transmit<Dut, In>(dut, val);
123+
}
124+
125+
126+
#endif // TEST_HELPERS_HPP

dv/UartRx/UartRx.cpp

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,11 @@
11
#include <catch2/catch_test_macros.hpp>
22
#include <NyuCatch2TestUtil.hpp>
33

4+
#include <TestHelpers.hpp>
45
#include <VSyncUartRx.h>
56

67
using VUartRx = VSyncUartRx;
78

8-
9-
constexpr unsigned Oversample = 16;
10-
11-
static void start(auto& rx, unsigned ticks = Oversample) {
12-
rx.in = 1;
13-
nyu::tick(rx);
14-
rx.in = 0;
15-
nyu::tick(rx, ticks);
16-
}
17-
18-
static void transmit(auto& rx, std::uint8_t val, unsigned ticks = Oversample) {
19-
for(unsigned i {0}; i < 8; ++i) {
20-
rx.in = val & 0x1;
21-
nyu::tick(rx, ticks);
22-
val >>= 1;
23-
}
24-
}
25-
26-
static void start_transmit(auto& rx, std::uint8_t val) {
27-
start(rx);
28-
transmit(rx, val);
29-
}
30-
319
TEST_CASE("UartRx, reset") {
3210
auto& rx {nyu::get_dut_catch2<VUartRx>()};
3311

dv/UartRx/UartRxEn.cpp

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,6 @@
88

99
using VUartRxEn = VSyncUartRxEn;
1010

11-
constexpr unsigned Oversample = 16;
12-
13-
static void start(auto& rx, unsigned ticks = Oversample) {
14-
rx.in = 1;
15-
nyu::tick(rx);
16-
rx.in = 0;
17-
nyu::tick(rx, ticks);
18-
}
19-
20-
static void transmit(auto& rx, std::uint8_t val, unsigned ticks = Oversample) {
21-
for(unsigned i {0}; i < 8; ++i) {
22-
rx.in = val & 0x1;
23-
nyu::tick(rx, ticks);
24-
val >>= 1;
25-
}
26-
}
27-
28-
static void start_transmit(auto& rx, std::uint8_t val) {
29-
start(rx);
30-
transmit(rx, val);
31-
}
32-
3311
TEST_CASE("UartRxEn, reset") {
3412
auto& rx {nyu::get_dut_catch2<VUartRxEn>()};
3513

vcpkg.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
"vcpkg-configuration": {
1414
"default-registry": {
1515
"kind": "git",
16-
"baseline": "b27f6bfad367d64f8f0f3296351c5d246e182bb4",
16+
"baseline": "685ad3e27c6073195cbcb1083f476cf9252c4b53",
1717
"repository": "https://github.com/microsoft/vcpkg.git"
1818
},
1919
"registries": [
2020
{
2121
"kind": "git",
22-
"baseline": "57eedffe114d1acde4b091f01f7f949ae4d5d6b8",
22+
"baseline": "65185af6b9b8e89506de3e42e52e6b617b333be4",
2323
"repository": "https://github.com/NYU-Processor-Design/nyu-registry.git",
2424
"packages": [
2525
"nyu-*"

0 commit comments

Comments
 (0)