98ffc91fb2cd8c8ffb8235407fff2532360f853b
1 /* Copyright (C) 2017 LambdaConcept */
8 #include <netinet/in.h>
9 # ifdef _XOPEN_SOURCE_EXTENDED
10 # include <arpa/inet.h>
12 #include <sys/socket.h>
20 #include <event2/listener.h>
21 #include <event2/util.h>
22 #include <event2/event.h>
24 void litex_sim_init(void **out
);
25 void litex_sim_dump();
27 struct session_list_s
{
30 struct ext_module_s
*module
;
31 struct session_list_s
*next
;
34 uint64_t timebase_ps
= 1;
35 uint64_t sim_time_ps
= 0;
36 struct session_list_s
*sesslist
=NULL
;
37 struct event_base
*base
=NULL
;
39 static int litex_sim_initialize_all(void **sim
, void *base
)
41 struct module_s
*ml
=NULL
;
42 struct module_s
*mli
=NULL
;
43 struct ext_module_list_s
*mlist
=NULL
;
44 struct ext_module_list_s
*pmlist
=NULL
;
45 //struct ext_module_list_s *mlisti=NULL;
46 struct pad_list_s
*plist
=NULL
;
47 struct pad_list_s
*pplist
=NULL
;
48 struct session_list_s
*slist
=NULL
;
53 /* Load external modules */
54 ret
= litex_sim_load_ext_modules(&mlist
);
59 for(pmlist
= mlist
; pmlist
; pmlist
=pmlist
->next
)
61 if(pmlist
->module
->start
)
63 pmlist
->module
->start(base
);
67 /* Load configuration */
68 ret
= litex_sim_file_parse("sim_config.js", &ml
, &timebase_ps
);
74 litex_sim_init(&vsim
);
76 /* Get pads from generated */
77 ret
= litex_sim_pads_get_list(&plist
);
83 for(mli
= ml
; mli
; mli
=mli
->next
)
86 /* Find the module in the external module */
88 ret
= litex_sim_find_ext_module(mlist
, mli
->name
, &pmlist
);
95 eprintf("Could not find module %s\n", mli
->name
);
99 slist
=(struct session_list_s
*)malloc(sizeof(struct session_list_s
));
105 memset(slist
, 0, sizeof(struct session_list_s
));
107 slist
->tickfirst
= mli
->tickfirst
;
108 slist
->module
= pmlist
->module
;
109 slist
->next
= sesslist
;
110 ret
= pmlist
->module
->new_sess(&slist
->session
, mli
->args
);
117 /* For each interface */
118 for(i
= 0; i
< mli
->niface
; i
++)
122 ret
= litex_sim_pads_find(plist
, mli
->iface
[i
].name
, mli
->iface
[i
].index
, &pplist
);
129 eprintf("Could not find interface %s with index %d\n", mli
->iface
[i
].name
, mli
->iface
[i
].index
);
132 ret
= pmlist
->module
->add_pads(slist
->session
, pplist
);
144 int litex_sim_sort_session()
146 struct session_list_s
*s
;
147 struct session_list_s
*sprev
=sesslist
;
154 for(s
= sesslist
->next
; s
; s
=s
->next
)
158 sprev
->next
= s
->next
;
172 static void cb(int sock
, short which
, void *arg
)
174 struct session_list_s
*s
;
181 for(i
= 0; i
< 1000; i
++)
183 for(s
= sesslist
; s
; s
=s
->next
)
186 s
->module
->tick(s
->session
, sim_time_ps
);
189 litex_sim_eval(vsim
);
192 for(s
= sesslist
; s
; s
=s
->next
)
195 s
->module
->tick(s
->session
, sim_time_ps
);
198 sim_time_ps
= litex_sim_increment_time(timebase_ps
);
200 if (litex_sim_got_finish()) {
201 event_base_loopbreak(base
);
206 if (!evtimer_pending(ev
, NULL
)) {
208 evtimer_add(ev
, &tv
);
212 int main(int argc
, char *argv
[])
221 WSAStartup(0x0201, &wsa_data
);
225 base
= event_base_new();
228 eprintf("Can't allocate base\n");
233 litex_sim_init_cmdargs(argc
, argv
);
234 if(RC_OK
!= (ret
= litex_sim_initialize_all(&vsim
, base
)))
239 if(RC_OK
!= (ret
= litex_sim_sort_session()))
246 ev
= event_new(base
, -1, EV_PERSIST
, cb
, vsim
);
248 event_base_dispatch(base
);
250 litex_sim_coverage_dump();