63c9cf8947b58cd219a5f9885948c3b9fe418b06
[soc-cxxrtl-sim.git] / small_jtag_test / main.cpp
1
2 #include <iostream>
3 #include "add.cpp"
4
5 using namespace std;
6
7 extern "C" {
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include <sys/select.h>
13
14 /* reads from a socket if it is ready (a single byte) and returns 1 if success
15 */
16 int read_handler(int fdread, char *buffer)
17 {
18 ssize_t read_len;
19 fd_set read_fds;
20 FD_ZERO(&read_fds);
21 struct timeval tv;
22 FD_SET(fdread, &read_fds);
23 int status;
24
25 tv.tv_sec = 0;
26 tv.tv_usec = 1;
27
28 status = select(fdread+1, &read_fds, NULL, NULL, &tv);
29 switch (status)
30 {
31 case -1:
32 exit(status); // error
33 return 0;
34 case 0:
35 return 0; // timeout (nothing read)
36 default:
37 return read(fdread, buffer, 1);
38 }
39 }
40
41 /*
42 static void event_handler(int fd, short event, void *arg)
43 {
44 if (event & EV_READ)
45 read_handler(fd, event, arg);
46 }
47
48 static void accept_conn_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *address, int socklen, void *ctx)
49 {
50 struct session_s *s = (struct session_s*)ctx;
51 struct timeval tv = {1, 0};
52
53 s->fd = fd;
54 s->ev = event_new(base, fd, EV_READ | EV_PERSIST , event_handler, s);
55 event_add(s->ev, &tv);
56 }
57
58 static int jtagremote_new(void **sess, char *args)
59 {
60 int ret = RC_OK;
61 struct session_s *s = NULL;
62 char *cport = NULL;
63 int port;
64 struct evconnlistener *listener;
65 struct sockaddr_in sin;
66
67 if(!sess) {
68 ret = RC_INVARG;
69 goto out;
70 }
71
72 ret = litex_sim_module_get_args(args, "port", &cport);
73 if(RC_OK != ret)
74 goto out;
75
76 printf("Found port %s\n", cport);
77 sscanf(cport, "%d", &port);
78 free(cport);
79 if(!port) {
80 ret = RC_ERROR;
81 fprintf(stderr, "Invalid port selected!\n");
82 goto out;
83 }
84
85 s=(struct session_s*)malloc(sizeof(struct session_s));
86 if(!s) {
87 ret = RC_NOENMEM;
88 goto out;
89 }
90 memset(s, 0, sizeof(struct session_s));
91
92 memset(&sin, 0, sizeof(sin));
93 sin.sin_family = AF_INET;
94 sin.sin_addr.s_addr = htonl(0);
95 sin.sin_port = htons(port);
96 listener = evconnlistener_new_bind(base, accept_conn_cb, s, LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1, (struct sockaddr*)&sin, sizeof(sin));
97 if (!listener) {
98 ret=RC_ERROR;
99 eprintf("Can't bind port %d\n!\n", port);
100 goto out;
101 }
102 evconnlistener_set_error_cb(listener, accept_error_cb);
103
104 out:
105 *sess=(void*)s;
106 return ret;
107 }
108
109 if(s->datalen)
110 {
111 c = s->databuf[s->data_start];
112
113 if((c >= '0') && (c <= '7')){
114 *s->tck = ((c - '0') >> 2) & 1;
115 *s->tms = ((c - '0') >> 1) & 1;
116 *s->tdi = (c - '0') & 1;
117 }
118 if(c == 'R'){
119 val = *s->tdo + '0';
120 if(-1 == write(s->fd, &val, 1)) {
121 eprintf("Error writing on socket\n");
122 ret = RC_ERROR;
123 goto out;
124 }
125 }
126 s->data_start = (s->data_start + 1) % 2048;
127 s->datalen--;
128 }
129
130 out:
131 return ret;
132 */
133
134 } // extern "C"
135
136 int main()
137 {
138 cxxrtl_design::p_add top;
139
140 bool prev_led = 0;
141
142 top.step();
143 for(int cycle=0;cycle<1000;++cycle){
144
145 top.p_clk.set<bool>(false);
146 top.step();
147 top.p_clk.set<bool>(true);
148 top.step();
149
150 // check that the output is correct
151 /*
152 top.p_a.set<uint8_t>(5);
153 top.p_b.set<uint8_t>(3);
154 uint32_t f = top.p_f.get<uint32_t>();
155
156 cout << "f " << f << endl;
157 */
158 }
159 }
160