112855Sgabeblack@google.com#include "systemc.h"
212855Sgabeblack@google.com#include "specialized_signals/scx_signal_int.h"
312855Sgabeblack@google.com#include "specialized_signals/scx_signal_signed.h"
412855Sgabeblack@google.com#include "specialized_signals/scx_signal_uint.h"
512855Sgabeblack@google.com#include "specialized_signals/scx_signal_unsigned.h"
612855Sgabeblack@google.com
712855Sgabeblack@google.comSC_MODULE(up_down)
812855Sgabeblack@google.com{
912855Sgabeblack@google.com    sc_in_clk             clk;
1012855Sgabeblack@google.com    sc_in<sc_uint<1> >    up;
1112855Sgabeblack@google.com    sc_in<sc_uint<1> >    down;
1212855Sgabeblack@google.com    sc_in<sc_uint<9> >    data_in;
1312855Sgabeblack@google.com    sc_inout<sc_uint<1> > parity_out;
1412855Sgabeblack@google.com    sc_inout<sc_uint<1> > carry_out;
1512855Sgabeblack@google.com    sc_inout<sc_uint<1> > borrow_out;
1612855Sgabeblack@google.com    sc_inout<sc_uint<9> > count_out;
1712855Sgabeblack@google.com
1812855Sgabeblack@google.com    sc_uint<10>           cnt_dn;
1912855Sgabeblack@google.com    sc_uint<10>           cnt_up;
2012855Sgabeblack@google.com    sc_uint<9>            count_nxt;
2112855Sgabeblack@google.com    sc_uint<1>            load;
2212855Sgabeblack@google.com
2312855Sgabeblack@google.com	SC_CTOR(up_down)
2412855Sgabeblack@google.com	{
2512855Sgabeblack@google.com		SC_METHOD(run);
2612855Sgabeblack@google.com		sensitive << clk.pos();
2712855Sgabeblack@google.com	}
2812855Sgabeblack@google.com
2912855Sgabeblack@google.com     void run()
3012855Sgabeblack@google.com	 {
3112855Sgabeblack@google.com        cnt_dn = count_out - 5;
3212855Sgabeblack@google.com        cnt_up = count_out + 3;
3312855Sgabeblack@google.com
3412855Sgabeblack@google.com        load = 1;
3512855Sgabeblack@google.com        switch( (unsigned int )(up,down) ) {
3612855Sgabeblack@google.com          case(0):
3712855Sgabeblack@google.com		    count_nxt = data_in;
3812855Sgabeblack@google.com            break;
3912855Sgabeblack@google.com          case(1):
4012855Sgabeblack@google.com            count_nxt = cnt_dn;
4112855Sgabeblack@google.com            break;
4212855Sgabeblack@google.com          case(2):
4312855Sgabeblack@google.com            count_nxt = cnt_up;
4412855Sgabeblack@google.com            break;
4512855Sgabeblack@google.com          case(3):
4612855Sgabeblack@google.com            load = 0;
4712855Sgabeblack@google.com            break;
4812855Sgabeblack@google.com        }
4912855Sgabeblack@google.com
5012855Sgabeblack@google.com        if( load)  {
5112855Sgabeblack@google.com                parity_out = count_nxt.xor_reduce();
5212855Sgabeblack@google.com                carry_out = up&cnt_up[9];
5312855Sgabeblack@google.com                borrow_out = down&cnt_dn[9];
5412855Sgabeblack@google.com                count_out = count_nxt;
5512855Sgabeblack@google.com       }
5612855Sgabeblack@google.com    }
5712855Sgabeblack@google.com};
5812855Sgabeblack@google.com
5912855Sgabeblack@google.com
6012855Sgabeblack@google.com#define UP_DOWN(up, down) up, down
6112855Sgabeblack@google.com
6212855Sgabeblack@google.comstruct stimulus {
6312855Sgabeblack@google.com   int up;
6412855Sgabeblack@google.com   int down;
6512855Sgabeblack@google.com   int data_in;
6612855Sgabeblack@google.com} s[] = {
6712855Sgabeblack@google.com	{ UP_DOWN(0, 0), 200 }, /* load 200 */
6812855Sgabeblack@google.com        { UP_DOWN(1, 0), 0 },   /* inc */
6912855Sgabeblack@google.com        { UP_DOWN(1, 0), 0 },   /* inc */
7012855Sgabeblack@google.com        { UP_DOWN(0, 1), 0 },   /* dec */
7112855Sgabeblack@google.com        { UP_DOWN(0, 1), 0 },   /* dec */
7212855Sgabeblack@google.com        { UP_DOWN(0, 1), 0 },   /* dec */
7312855Sgabeblack@google.com	{ UP_DOWN(1, 1), 0 },   /* hold */
7412855Sgabeblack@google.com	{ UP_DOWN(1, 1), 0 },   /* hold */
7512855Sgabeblack@google.com	{ UP_DOWN(1, 1), 0 },   /* hold */
7612855Sgabeblack@google.com	{ UP_DOWN(0, 0), 200 }, /* load 200 */
7712855Sgabeblack@google.com	{ UP_DOWN(1, 1), 0 },   /* hold */
7812855Sgabeblack@google.com	{ UP_DOWN(1, 1), 0 },   /* hold */
7912855Sgabeblack@google.com        { UP_DOWN(0, 1), 0 },   /* dec */
8012855Sgabeblack@google.com	{ UP_DOWN(0, 0), 2 },   /* load 2 */
8112855Sgabeblack@google.com        { UP_DOWN(0, 1), 0 },   /* dec */
8212855Sgabeblack@google.com	{ UP_DOWN(0, 0), 0x1ff},/* load 0x1ff */
8312855Sgabeblack@google.com        { UP_DOWN(1, 0), 0 },   /* inc */
8412855Sgabeblack@google.com};
8512855Sgabeblack@google.com
8612855Sgabeblack@google.com
8712855Sgabeblack@google.comint sc_main(int argc, char* argv[])
8812855Sgabeblack@google.com{
8912855Sgabeblack@google.com    sc_signal<sc_uint<1> > borrow_out;
9012855Sgabeblack@google.com    sc_signal<sc_uint<1> > carry_out;
9112855Sgabeblack@google.com	sc_clock			   clock;
9212855Sgabeblack@google.com    sc_signal<sc_uint<9> > count_out;
9312855Sgabeblack@google.com    sc_signal<sc_uint<9> > data_in;
9412855Sgabeblack@google.com    sc_signal<sc_uint<1> > down;
9512855Sgabeblack@google.com    unsigned int           i;
9612855Sgabeblack@google.com    sc_signal<sc_uint<1> > parity_out;
9712855Sgabeblack@google.com    sc_signal<sc_uint<1> > up;
9812855Sgabeblack@google.com
9912855Sgabeblack@google.com    up_down up_down_0("up_down_0");
10012855Sgabeblack@google.com		up_down_0.borrow_out(borrow_out);
10112855Sgabeblack@google.com		up_down_0.carry_out(carry_out);
10212855Sgabeblack@google.com		up_down_0.data_in(data_in);
10312855Sgabeblack@google.com		up_down_0.clk(clock);
10412855Sgabeblack@google.com		up_down_0.count_out(count_out);
10512855Sgabeblack@google.com		up_down_0.down(down);
10612855Sgabeblack@google.com		up_down_0.parity_out(parity_out);
10712855Sgabeblack@google.com		up_down_0.up(up);
10812855Sgabeblack@google.com
10912855Sgabeblack@google.com    printf("%5s %2s %4s %7s %10s %8s %10s %9s\n",
11012855Sgabeblack@google.com    	   "clock", "up", "down", "data_in", "parity_out",
11112855Sgabeblack@google.com	   "carry_out", "borrow_out", "count_out");
11212855Sgabeblack@google.com
11312855Sgabeblack@google.com    for( i = 0; i < sizeof s/sizeof(struct stimulus); i++) {
11412855Sgabeblack@google.com        up = s[i].up;
11512855Sgabeblack@google.com        down = s[i].down;
11612855Sgabeblack@google.com        data_in = s[i].data_in;
11712855Sgabeblack@google.com
11812855Sgabeblack@google.com		sc_start(1, SC_NS);
11912855Sgabeblack@google.com
12012855Sgabeblack@google.com        printf("%5d %2d %4d %7d %10d %8d %10d %9d\n",
12112855Sgabeblack@google.com			(int)sc_time_stamp().to_double()/1000, (int)up, (int)down,
12212855Sgabeblack@google.com			(int)data_in, (int)parity_out, (int)carry_out, (int)borrow_out,
12312855Sgabeblack@google.com			(int)count_out);
12412855Sgabeblack@google.com    }
12512855Sgabeblack@google.com
12612855Sgabeblack@google.com    /* get last register values */
12712855Sgabeblack@google.com    printf("%5d %2d %4d %7d %10d %8d %10d %9d\n",
12812855Sgabeblack@google.com		(int)sc_time_stamp().to_double()/1000, (int)up, (int)down,
12912855Sgabeblack@google.com		(int)data_in, (int)parity_out, (int)carry_out, (int)borrow_out,
13012855Sgabeblack@google.com		(int)count_out);
13112855Sgabeblack@google.com
13212855Sgabeblack@google.com	return 0;
13312855Sgabeblack@google.com}
13412855Sgabeblack@google.com
135