Dawn Framework 1.0
Universal data acquisition framework for embedded systems
test_expression.cxx
1// dawn/tests/prog/test_expression.cxx
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#include "dawn/prog/expression.hxx"
7#include "test_common.hxx"
8
9#include "dawn/io/sdata.hxx"
10#include "dawn/io/virt.hxx"
11
12using namespace dawn;
13
14static constexpr auto EXPR_SRC = CIOVirt::objectId(SObjectId::DTYPE_UINT32, false, 90);
15static constexpr auto EXPR_DST = CIOVirt::objectId(SObjectId::DTYPE_UINT32, false, 91);
16
17static uint32_t g_cfg_src[] = {EXPR_SRC, 0};
18static uint32_t g_cfg_dst[] = {EXPR_DST, 0};
19
20static uint32_t g_bin_expr_shl[] = {
21 CProgExpression::objectId(0),
22 2,
23 CProgExpression::cfgIdIOBind(2),
24 EXPR_SRC,
25 EXPR_DST,
26 CProgExpression::cfgIdOp(),
27 CProgExpression::OP_SHIFT_LEFT,
28 2, // constant
29};
30
31static uint32_t g_bin_expr_const_shl[] = {
32 CProgExpression::objectId(1),
33 2,
34 CProgExpression::cfgIdIOBind(2),
35 EXPR_SRC,
36 EXPR_DST,
37 CProgExpression::cfgIdOp(),
38 CProgExpression::OP_CONST_LEFT_SHIFT,
39 1, // constant=1 → 1 << input
40};
41
42static uint32_t g_bin_expr_add[] = {
43 CProgExpression::objectId(2),
44 2,
45 CProgExpression::cfgIdIOBind(2),
46 EXPR_SRC,
47 EXPR_DST,
48 CProgExpression::cfgIdOp(),
49 CProgExpression::OP_ADD,
50 10,
51};
52
53static void test_expression_shift_left()
54{
55 CDescObject srcDesc(g_cfg_src);
56 CIOVirt src(srcDesc);
57 CDescObject dstDesc(g_cfg_dst);
58 CIOVirt dst(dstDesc);
59 CDescObject progDesc(g_bin_expr_shl);
60 CProgExpression prog(progDesc);
61
64
65 TEST_ASSERT_EQUAL(OK, src.init());
66 TEST_ASSERT_EQUAL(OK, dst.init());
67 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
68 TEST_ASSERT_EQUAL(OK, prog.configure());
69 prog.setObjectMapItem(EXPR_SRC, &src);
70 prog.setObjectMapItem(EXPR_DST, &dst);
71 TEST_ASSERT_EQUAL(OK, prog.init());
72 TEST_ASSERT_EQUAL(OK, prog.start());
73
74 in(0) = 3;
75 TEST_ASSERT_EQUAL(OK, src.setData(in));
76 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
77 TEST_ASSERT_EQUAL(12, out(0)); // 3 << 2 = 12
78
79 in(0) = 0;
80 TEST_ASSERT_EQUAL(OK, src.setData(in));
81 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
82 TEST_ASSERT_EQUAL(0, out(0));
83
84 TEST_ASSERT_EQUAL(OK, prog.stop());
85}
86
87static void test_expression_const_left_shift()
88{
89 CDescObject srcDesc(g_cfg_src);
90 CIOVirt src(srcDesc);
91 CDescObject dstDesc(g_cfg_dst);
92 CIOVirt dst(dstDesc);
93 CDescObject progDesc(g_bin_expr_const_shl);
94 CProgExpression prog(progDesc);
95
98
99 TEST_ASSERT_EQUAL(OK, src.init());
100 TEST_ASSERT_EQUAL(OK, dst.init());
101 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
102 TEST_ASSERT_EQUAL(OK, prog.configure());
103 prog.setObjectMapItem(EXPR_SRC, &src);
104 prog.setObjectMapItem(EXPR_DST, &dst);
105 TEST_ASSERT_EQUAL(OK, prog.init());
106 TEST_ASSERT_EQUAL(OK, prog.start());
107
108 in(0) = 0;
109 TEST_ASSERT_EQUAL(OK, src.setData(in));
110 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
111 TEST_ASSERT_EQUAL(1, out(0)); // 1 << 0 = 1
112
113 in(0) = 3;
114 TEST_ASSERT_EQUAL(OK, src.setData(in));
115 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
116 TEST_ASSERT_EQUAL(8, out(0)); // 1 << 3 = 8
117
118 TEST_ASSERT_EQUAL(OK, prog.stop());
119}
120
121static void test_expression_add()
122{
123 CDescObject srcDesc(g_cfg_src);
124 CIOVirt src(srcDesc);
125 CDescObject dstDesc(g_cfg_dst);
126 CIOVirt dst(dstDesc);
127 CDescObject progDesc(g_bin_expr_add);
128 CProgExpression prog(progDesc);
129
132
133 TEST_ASSERT_EQUAL(OK, src.init());
134 TEST_ASSERT_EQUAL(OK, dst.init());
135 TEST_ASSERT_EQUAL(OK, src.initialize(1, 1, true));
136 TEST_ASSERT_EQUAL(OK, prog.configure());
137 prog.setObjectMapItem(EXPR_SRC, &src);
138 prog.setObjectMapItem(EXPR_DST, &dst);
139 TEST_ASSERT_EQUAL(OK, prog.init());
140 TEST_ASSERT_EQUAL(OK, prog.start());
141
142 in(0) = 5;
143 TEST_ASSERT_EQUAL(OK, src.setData(in));
144 TEST_ASSERT_EQUAL(OK, dst.getData(out, 1));
145 TEST_ASSERT_EQUAL(15, out(0)); // 5 + 10
146
147 TEST_ASSERT_EQUAL(OK, prog.stop());
148}
149
150extern "C"
151{
152 int test_prog_expression()
153 {
154 UNITY_BEGIN();
155 DAWN_RUN_TEST(test_expression_shift_left);
156 DAWN_RUN_TEST(test_expression_const_left_shift);
157 DAWN_RUN_TEST(test_expression_add);
158 return UNITY_END();
159 }
160}
Descriptor wrapper for individual object configuration.
Virtual I/O type for user-provided data and callbacks.
Definition virt.hxx:26
Arithmetic expression evaluator on IO values.
Out-of-tree user-extension hooks for Dawn.
Definition bindable.hxx:13
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
Definition objectid.hxx:96
Static (compile-time) I/O data buffer (no timestamp).
Definition sdata.hxx:39