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"
|
#include "prv.h"
|
||||||
|
|
||||||
void
|
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->n = 0;
|
||||||
chan->type = type;
|
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->ev = -1;
|
||||||
chan->prv = prv;
|
chan->prv = prv;
|
||||||
chan->clock = clock;
|
chan->clock = clock;
|
||||||
chan->t = -1;
|
chan->t = *clock;
|
||||||
chan->row = row;
|
chan->row = row;
|
||||||
chan->dirty = 0;
|
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
|
void
|
||||||
chan_enable(struct ovni_chan *chan, int enabled)
|
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->enabled = enabled;
|
||||||
|
chan->t = *chan->clock;
|
||||||
|
chan->dirty = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -33,15 +70,15 @@ chan_is_enabled(struct ovni_chan *chan)
|
|||||||
void
|
void
|
||||||
chan_set(struct ovni_chan *chan, int st)
|
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->enabled);
|
||||||
assert(chan->dirty == 0);
|
//assert(chan->dirty == 0);
|
||||||
|
|
||||||
if(chan->n == 0)
|
if(chan->n == 0)
|
||||||
chan->n = 1;
|
chan->n = 1;
|
||||||
|
|
||||||
chan->stack[chan->n] = st;
|
chan->stack[chan->n - 1] = st;
|
||||||
chan->t = *chan->clock;
|
chan->t = *chan->clock;
|
||||||
chan->dirty = 1;
|
chan->dirty = 1;
|
||||||
}
|
}
|
||||||
@ -49,7 +86,7 @@ chan_set(struct ovni_chan *chan, int st)
|
|||||||
void
|
void
|
||||||
chan_push(struct ovni_chan *chan, int st)
|
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->enabled);
|
||||||
assert(chan->dirty == 0);
|
assert(chan->dirty == 0);
|
||||||
@ -70,7 +107,7 @@ chan_pop(struct ovni_chan *chan, int expected_st)
|
|||||||
{
|
{
|
||||||
int 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->enabled);
|
||||||
assert(chan->dirty == 0);
|
assert(chan->dirty == 0);
|
||||||
@ -100,6 +137,8 @@ chan_pop(struct ovni_chan *chan, int expected_st)
|
|||||||
void
|
void
|
||||||
chan_ev(struct ovni_chan *chan, int ev)
|
chan_ev(struct ovni_chan *chan, int ev)
|
||||||
{
|
{
|
||||||
|
dbg("chan_ev chan=%p ev=%d\n", (void*) chan, ev);
|
||||||
|
|
||||||
assert(chan->enabled);
|
assert(chan->enabled);
|
||||||
assert(chan->dirty == 0);
|
assert(chan->dirty == 0);
|
||||||
assert(ev >= 0);
|
assert(ev >= 0);
|
||||||
@ -115,6 +154,9 @@ chan_get_st(struct ovni_chan *chan)
|
|||||||
if(chan->enabled == 0)
|
if(chan->enabled == 0)
|
||||||
return chan->badst;
|
return chan->badst;
|
||||||
|
|
||||||
|
if(chan->n == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
assert(chan->n > 0);
|
assert(chan->n > 0);
|
||||||
return chan->stack[chan->n-1];
|
return chan->stack[chan->n-1];
|
||||||
}
|
}
|
||||||
@ -141,8 +183,6 @@ emit_st(struct ovni_chan *chan)
|
|||||||
{
|
{
|
||||||
int st;
|
int st;
|
||||||
|
|
||||||
assert(chan->enabled);
|
|
||||||
|
|
||||||
st = chan_get_st(chan);
|
st = chan_get_st(chan);
|
||||||
|
|
||||||
prv_ev(chan->prv, chan->row, chan->t, chan->type, st);
|
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)
|
if(chan->dirty == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
//dbg("chan_emit chan=%p\n", (void*) chan);
|
||||||
|
|
||||||
/* Emit badst if disabled */
|
/* Emit badst if disabled */
|
||||||
if(chan->enabled == 0)
|
if(chan->enabled == 0)
|
||||||
{
|
{
|
||||||
|
8
chan.h
8
chan.h
@ -4,7 +4,13 @@
|
|||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
|
|
||||||
void
|
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
|
void
|
||||||
chan_enable(struct ovni_chan *chan, int enabled);
|
chan_enable(struct ovni_chan *chan, int enabled);
|
||||||
|
5
emu.h
5
emu.h
@ -66,6 +66,11 @@ struct nosv_task_type {
|
|||||||
|
|
||||||
#define MAX_CHAN_STACK 128
|
#define MAX_CHAN_STACK 128
|
||||||
|
|
||||||
|
enum chan_track {
|
||||||
|
CHAN_TRACK_NONE = 0,
|
||||||
|
CHAN_TRACK_TH_RUNNING,
|
||||||
|
};
|
||||||
|
|
||||||
struct ovni_chan {
|
struct ovni_chan {
|
||||||
/* Number of states in the stack */
|
/* Number of states in the stack */
|
||||||
int n;
|
int n;
|
||||||
|
Loading…
Reference in New Issue
Block a user