build/sim: use a real timebase in the simulation
[litex.git] / litex / build / sim / config.py
1 # This file is Copyright (c) 2017 Pierre-Olivier Vauboin <po@lambdaconcept>
2 # This file is Copyright (c) 2018 Florent Kermarrec <florent@enjoy-digital.fr>
3 # License: BSD
4
5 import json
6
7 class SimConfig():
8 def __init__(self, default_clk=None, timebase_ps=1):
9 self.modules = []
10 self.default_clk = default_clk
11 self.timebase = timebase_ps
12 if default_clk:
13 self.add_clocker(default_clk)
14
15 def _format_interfaces(self, interfaces):
16 if not isinstance(interfaces, list):
17 interfaces = [interfaces]
18 new = []
19 for it in interfaces:
20 obj = it
21 if isinstance(it, tuple):
22 name, index = it
23 obj = {"name": name, "index": index}
24 new.append(obj)
25 return new
26
27 def _format_timebase(self):
28 return {"timebase": int(self.timebase)}
29
30 def add_clocker(self, clk):
31 self.add_module("clocker", [], clocks=clk, tickfirst=True)
32
33 def add_module(self, name, interfaces, clocks=None, args=None, tickfirst=False):
34 interfaces = self._format_interfaces(interfaces)
35 if clocks:
36 interfaces += self._format_interfaces(clocks)
37 else:
38 interfaces += [self.default_clk]
39 newmod = {
40 "module": name,
41 "interface": interfaces,
42 }
43 if args:
44 newmod.update({"args": args})
45 if tickfirst:
46 newmod.update({"tickfirst": tickfirst})
47 self.modules.append(newmod)
48
49 def has_module(self, name):
50 for module in self.modules:
51 if module["module"] == name:
52 return True
53 return False
54
55 def get_json(self):
56 config = self.modules + [self._format_timebase()]
57 return json.dumps(config, indent=4)