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