Allow duplicates in the mux output channel
This commit is contained in:
parent
9cc563d0dd
commit
227a2d91df
@ -144,6 +144,10 @@ mux_init(struct mux *mux,
|
|||||||
* input and select channel at the same time. */
|
* input and select channel at the same time. */
|
||||||
chan_prop_set(output, CHAN_DIRTY_WRITE, 1);
|
chan_prop_set(output, CHAN_DIRTY_WRITE, 1);
|
||||||
|
|
||||||
|
/* Similarly, we may switch to an input channel that has the same value
|
||||||
|
* as the last output value, so we allow duplicates too */
|
||||||
|
chan_prop_set(output, CHAN_DUPLICATES, 1);
|
||||||
|
|
||||||
memset(mux, 0, sizeof(struct mux_input));
|
memset(mux, 0, sizeof(struct mux_input));
|
||||||
mux->select = select;
|
mux->select = select;
|
||||||
mux->output = output;
|
mux->output = output;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "emu/mux.h"
|
#include "emu/mux.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#define N 6
|
#define N 10
|
||||||
|
|
||||||
//static int
|
//static int
|
||||||
//select_active_thread(struct mux *mux,
|
//select_active_thread(struct mux *mux,
|
||||||
@ -164,6 +164,44 @@ test_mid_propagate(struct mux *mux, int key)
|
|||||||
check_output(mux, value_int64(new_value));
|
check_output(mux, value_int64(new_value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_duplicate_output(struct mux *mux, int key1, int key2)
|
||||||
|
{
|
||||||
|
int new_value = 2000 + key1;
|
||||||
|
|
||||||
|
struct mux_input *in1 = mux_find_input(mux, value_int64(key1));
|
||||||
|
if (in1 == NULL)
|
||||||
|
die("mux_find_input failed to locate input1 %d\n", key1);
|
||||||
|
|
||||||
|
struct mux_input *in2 = mux_find_input(mux, value_int64(key2));
|
||||||
|
if (in2 == NULL)
|
||||||
|
die("mux_find_input failed to locate input2 %d\n", key2);
|
||||||
|
|
||||||
|
if (chan_set(in1->chan, value_int64(new_value)) != 0)
|
||||||
|
die("chan_set failed\n");
|
||||||
|
|
||||||
|
if (chan_set(in2->chan, value_int64(new_value)) != 0)
|
||||||
|
die("chan_set failed\n");
|
||||||
|
|
||||||
|
/* Select input 1 */
|
||||||
|
if (chan_set(mux->select, value_int64(key1)) != 0)
|
||||||
|
die("chan_set failed\n");
|
||||||
|
|
||||||
|
if (bay_propagate(mux->bay) != 0)
|
||||||
|
die("bay_propagate failed\n");
|
||||||
|
|
||||||
|
check_output(mux, value_int64(new_value));
|
||||||
|
|
||||||
|
/* Now switch to input 2, which has the same value */
|
||||||
|
if (chan_set(mux->select, value_int64(key2)) != 0)
|
||||||
|
die("chan_set failed\n");
|
||||||
|
|
||||||
|
if (bay_propagate(mux->bay) != 0)
|
||||||
|
die("bay_propagate failed\n");
|
||||||
|
|
||||||
|
check_output(mux, value_int64(new_value));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(void)
|
main(void)
|
||||||
@ -212,6 +250,7 @@ main(void)
|
|||||||
test_select_and_input(&mux, 3);
|
test_select_and_input(&mux, 3);
|
||||||
test_input_and_select(&mux, 4);
|
test_input_and_select(&mux, 4);
|
||||||
test_mid_propagate(&mux, 5);
|
test_mid_propagate(&mux, 5);
|
||||||
|
test_duplicate_output(&mux, 6, 7);
|
||||||
|
|
||||||
err("OK\n");
|
err("OK\n");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user