1111#define SIZE 10
1212#define WAVEFORM " flow_scheduler.vcd"
1313
14- enum class Op { Push, Pop, PushPush, Nop };
14+ enum class Op {
15+ Push1, // single push through push port 1
16+ Push2, // single push through push port 2
17+ Pop,
18+ PushPush, // dual push through both ports
19+ Nop
20+ };
1521
1622struct FlowValue {
1723 unsigned int flow;
@@ -48,21 +54,25 @@ std::vector<Cmd> generate_commands(int num_cmds) {
4854
4955 for (int i = 0 ; i < num_cmds; i++) {
5056 Cmd cmd;
51- if (!size || size == SIZE) // to avoid over/underflow
52- cmd.op = !size ? Op::Push : Op::Pop;
57+ if (size == SIZE) // to avoid overflow
58+ cmd.op = Op::Pop;
59+ else if (!size) // to avoid underflow
60+ cmd.op = rand () % 2 ? Op::Push1 : Op::Push2;
5361 else {
54- int rng = rand () % 4 ;
55- switch (rng) {
62+ switch (rand () % 5 ) {
5663 case 0 :
57- cmd.op = Op::Push ;
64+ cmd.op = Op::Push1 ;
5865 break ;
5966 case 1 :
60- cmd.op = Op::Pop ;
67+ cmd.op = Op::Push2 ;
6168 break ;
6269 case 2 :
63- cmd.op = size == SIZE - 1 ? Op::Push : Op::PushPush ;
70+ cmd.op = Op::Pop ;
6471 break ;
6572 case 3 :
73+ cmd.op = size == SIZE - 1 ? Op::Push1 : Op::PushPush;
74+ break ;
75+ case 4 :
6676 cmd.op = Op::Nop;
6777 break ;
6878 }
@@ -79,7 +89,8 @@ std::vector<Cmd> generate_commands(int num_cmds) {
7989
8090 int delta;
8191 switch (cmd.op ) {
82- case Op::Push: delta = 1 ; break ;
92+ case Op::Push1:
93+ case Op::Push2: delta = 1 ; break ;
8394 case Op::Pop: delta = -1 ; break ;
8495 case Op::PushPush: delta = 2 ; break ;
8596 case Op::Nop: delta = 0 ; break ;
@@ -103,10 +114,14 @@ std::vector<FlowValue> compute_expected(std::vector<Cmd> cmds) {
103114
104115 for (Cmd cmd : cmds) {
105116 switch (cmd.op ) {
106- case Op::Push :
117+ case Op::Push1 :
107118 pifo.push (cmd.data_1 );
108119 break ;
109120
121+ case Op::Push2:
122+ pifo.push (cmd.data_2 );
123+ break ;
124+
110125 case Op::Pop:
111126 out.push_back (pifo.top ().flow_value );
112127 pifo.pop ();
@@ -167,8 +182,8 @@ std::vector<FlowValue> simulate(std::vector<Cmd> cmds, const char* waveform) {
167182 else {
168183 Cmd cmd = *it;
169184
170- dut->push_1 = cmd.op == Op::Push || cmd.op == Op::PushPush;
171- dut->push_2 = cmd.op == Op::PushPush;
185+ dut->push_1 = cmd.op == Op::Push1 || cmd.op == Op::PushPush;
186+ dut->push_2 = cmd.op == Op::Push2 || cmd. op == Op:: PushPush;
172187 dut->pop = cmd.op == Op::Pop;
173188
174189 dut->push_rank_1 = cmd.data_1 .rank ;
@@ -224,8 +239,12 @@ int main(int argc, char** argv, char** env) {
224239 r_2 = c.data_2 .rank ,
225240 f_2 = c.data_2 .flow_value .flow ;
226241 switch (c.op ) {
227- case Op::Push:
228- printf (" push(v=%u, f=%u, r=%u)\n " , v_1, f_1, r_1);
242+ case Op::Push1:
243+ printf (" push(v=%u, f=%u, r=%u) (port 1)\n " , v_1, f_1, r_1);
244+ break ;
245+
246+ case Op::Push2:
247+ printf (" push(v=%u, f=%u, r=%u) (port 2)\n " , v_2, f_2, r_2);
229248 break ;
230249
231250 case Op::Pop:
0 commit comments