Add support for tracking modes in channels
This commit is contained in:
parent
d6afd5c528
commit
dd1567e0ec
60
chan.c
60
chan.c
@ -4,7 +4,7 @@
|
||||
#include "prv.h"
|
||||
|
||||
void
|
||||
chan_init(struct ovni_chan *chan, int row, int type, FILE *prv, int64_t *clock)
|
||||
chan_init(struct ovni_chan *chan, int track, int row, int type, FILE *prv, int64_t *clock)
|
||||
{
|
||||
chan->n = 0;
|
||||
chan->type = type;
|
||||
@ -13,15 +13,52 @@ chan_init(struct ovni_chan *chan, int row, int type, FILE *prv, int64_t *clock)
|
||||
chan->ev = -1;
|
||||
chan->prv = prv;
|
||||
chan->clock = clock;
|
||||
chan->t = -1;
|
||||
chan->t = *clock;
|
||||
chan->row = row;
|
||||
chan->dirty = 0;
|
||||
chan->track = track;
|
||||
}
|
||||
|
||||
void
|
||||
chan_th_init(struct ovni_ethread *th, int chan_index, int track, int row, FILE *prv, int64_t *clock)
|
||||
{
|
||||
struct ovni_chan *chan;
|
||||
int prvth;
|
||||
|
||||
chan = &th->chan[chan_index];
|
||||
prvth = chan_to_prvtype[chan_index][1];
|
||||
|
||||
chan_init(chan, track, row, prvth, prv, clock);
|
||||
}
|
||||
|
||||
void
|
||||
chan_cpu_init(struct ovni_cpu *cpu, int chan_index, int track, int row, FILE *prv, int64_t *clock)
|
||||
{
|
||||
struct ovni_chan *chan;
|
||||
int prvcpu;
|
||||
|
||||
chan = &cpu->chan[chan_index];
|
||||
prvcpu = chan_to_prvtype[chan_index][2];
|
||||
|
||||
chan_init(chan, track, row, prvcpu, prv, clock);
|
||||
}
|
||||
|
||||
void
|
||||
chan_enable(struct ovni_chan *chan, int enabled)
|
||||
{
|
||||
/* Can be dirty */
|
||||
|
||||
dbg("chan_enable chan=%p enabled=%d\n", (void*) chan, enabled);
|
||||
|
||||
if(chan->enabled == enabled)
|
||||
{
|
||||
err("chan already in enabled=%d\n", enabled);
|
||||
abort();
|
||||
}
|
||||
|
||||
chan->enabled = enabled;
|
||||
chan->t = *chan->clock;
|
||||
chan->dirty = 1;
|
||||
}
|
||||
|
||||
int
|
||||
@ -33,15 +70,15 @@ chan_is_enabled(struct ovni_chan *chan)
|
||||
void
|
||||
chan_set(struct ovni_chan *chan, int st)
|
||||
{
|
||||
dbg("chan_set st=%d", st);
|
||||
//dbg("chan_set chan=%p st=%d\n", (void*) chan, st);
|
||||
|
||||
assert(chan->enabled);
|
||||
assert(chan->dirty == 0);
|
||||
//assert(chan->dirty == 0);
|
||||
|
||||
if(chan->n == 0)
|
||||
chan->n = 1;
|
||||
|
||||
chan->stack[chan->n] = st;
|
||||
chan->stack[chan->n - 1] = st;
|
||||
chan->t = *chan->clock;
|
||||
chan->dirty = 1;
|
||||
}
|
||||
@ -49,7 +86,7 @@ chan_set(struct ovni_chan *chan, int st)
|
||||
void
|
||||
chan_push(struct ovni_chan *chan, int st)
|
||||
{
|
||||
dbg("chan_push st=%d", st);
|
||||
//dbg("chan_push chan=%p st=%d\n", (void*) chan, st);
|
||||
|
||||
assert(chan->enabled);
|
||||
assert(chan->dirty == 0);
|
||||
@ -70,7 +107,7 @@ chan_pop(struct ovni_chan *chan, int expected_st)
|
||||
{
|
||||
int st;
|
||||
|
||||
dbg("chan_pop expexted_st=%d", expected_st);
|
||||
//dbg("chan_pop chan=%p expected_st=%d\n", (void*) chan, expected_st);
|
||||
|
||||
assert(chan->enabled);
|
||||
assert(chan->dirty == 0);
|
||||
@ -100,6 +137,8 @@ chan_pop(struct ovni_chan *chan, int expected_st)
|
||||
void
|
||||
chan_ev(struct ovni_chan *chan, int ev)
|
||||
{
|
||||
dbg("chan_ev chan=%p ev=%d\n", (void*) chan, ev);
|
||||
|
||||
assert(chan->enabled);
|
||||
assert(chan->dirty == 0);
|
||||
assert(ev >= 0);
|
||||
@ -115,6 +154,9 @@ chan_get_st(struct ovni_chan *chan)
|
||||
if(chan->enabled == 0)
|
||||
return chan->badst;
|
||||
|
||||
if(chan->n == 0)
|
||||
return 0;
|
||||
|
||||
assert(chan->n > 0);
|
||||
return chan->stack[chan->n-1];
|
||||
}
|
||||
@ -141,8 +183,6 @@ emit_st(struct ovni_chan *chan)
|
||||
{
|
||||
int st;
|
||||
|
||||
assert(chan->enabled);
|
||||
|
||||
st = chan_get_st(chan);
|
||||
|
||||
prv_ev(chan->prv, chan->row, chan->t, chan->type, st);
|
||||
@ -155,6 +195,8 @@ chan_emit(struct ovni_chan *chan)
|
||||
if(chan->dirty == 0)
|
||||
return;
|
||||
|
||||
//dbg("chan_emit chan=%p\n", (void*) chan);
|
||||
|
||||
/* Emit badst if disabled */
|
||||
if(chan->enabled == 0)
|
||||
{
|
||||
|
8
chan.h
8
chan.h
@ -4,7 +4,13 @@
|
||||
#include "emu.h"
|
||||
|
||||
void
|
||||
chan_init(struct ovni_chan *chan, int row, int type, FILE *prv, int64_t *clock);
|
||||
chan_init(struct ovni_chan *chan, int track, int row, int type, FILE *prv, int64_t *clock);
|
||||
|
||||
void
|
||||
chan_th_init(struct ovni_ethread *th, int chan_index, int track, int row, FILE *prv, int64_t *clock);
|
||||
|
||||
void
|
||||
chan_cpu_init(struct ovni_cpu *cpu, int chan_index, int track, int row, FILE *prv, int64_t *clock);
|
||||
|
||||
void
|
||||
chan_enable(struct ovni_chan *chan, int enabled);
|
||||
|
Loading…
Reference in New Issue
Block a user