@@ -52,7 +52,7 @@ class Simulation(object):
52
52
}
53
53
54
54
def __init__ (
55
- self , tracer = True , register_value_map = None , memory_value_map = None ,
55
+ self , tracer = True , register_value_map = {} , memory_value_map = {} ,
56
56
default_value = 0 , block = None ):
57
57
""" Creates a new circuit simulator.
58
58
@@ -61,14 +61,15 @@ def __init__(
61
61
passed, no tracer is instantiated (which is good for long running simulations).
62
62
If the default (true) is passed, Simulation will create a new tracer automatically
63
63
which can be referenced by the member variable .tracer
64
- :param register_value_map: Defines the initial value for
65
- the registers specified . Format: {Register: value}.
64
+ :param register_value_map: Defines the initial value for the registers specified;
65
+ overrides the registers's reset_value . Format: {Register: value}.
66
66
:param memory_value_map: Defines initial values for many
67
67
addresses in a single or multiple memory. Format: {Memory: {address: Value}}.
68
68
Memory is a memory block, address is the address of a value
69
- :param default_value: is the value that all unspecified registers and
70
- memories will initialize to. If no default_value is specified, it will
71
- use the value stored in the object (default to 0)
69
+ :param default_value: The value that all unspecified registers and
70
+ memories will initialize to (default 0). For registers, this is the value that
71
+ will be used if the particular register doesn't have a specified reset_value,
72
+ and isn't found in the register_value_map.
72
73
:param block: the hardware block to be traced (which might be of type PostSynthesisBlock).
73
74
defaults to the working block
74
75
@@ -94,20 +95,23 @@ def __init__(
94
95
self .tracer = tracer
95
96
self ._initialize (register_value_map , memory_value_map )
96
97
97
- def _initialize (self , register_value_map = None , memory_value_map = None ):
98
+ def _initialize (self , register_value_map = {} , memory_value_map = {} ):
98
99
""" Sets the wire, register, and memory values to default or as specified.
99
100
100
101
:param register_value_map: is a map of {Register: value}.
101
102
:param memory_value_map: is a map of maps {Memory: {address: Value}}.
102
- :param default_value: is the value that all unspecified registers and memories will
103
- default to. If no default_value is specified, it will use the value stored in the
104
- object (default to 0)
103
+ :param default_value: is the value that all unspecified registers and
104
+ memories will initialize to (default 0). For registers, this is the value that
105
+ will be used if the particular register doesn't have a specified reset_value,
106
+ and isn't found in the register_value_map.
105
107
"""
106
108
# set registers to their values
107
109
reg_set = self .block .wirevector_subset (Register )
108
- if register_value_map is not None :
109
- for r in reg_set :
110
- self .value [r ] = self .regvalue [r ] = register_value_map .get (r , self .default_value )
110
+ for r in reg_set :
111
+ rval = register_value_map .get (r , r .reset_value )
112
+ if rval is None :
113
+ rval = self .default_value
114
+ self .value [r ] = self .regvalue [r ] = rval
111
115
112
116
# set constants to their set values
113
117
for w in self .block .wirevector_subset (Const ):
@@ -120,21 +124,20 @@ def _initialize(self, register_value_map=None, memory_value_map=None):
120
124
if memid not in self .memvalue :
121
125
self .memvalue [memid ] = {}
122
126
123
- if memory_value_map is not None :
124
- for (mem , mem_map ) in memory_value_map .items ():
125
- if isinstance (mem , RomBlock ):
126
- raise PyrtlError ('error, one or more of the memories in the map is a RomBlock' )
127
- if isinstance (self .block , PostSynthBlock ):
128
- mem = self .block .mem_map [mem ] # pylint: disable=maybe-no-member
129
- self .memvalue [mem .id ] = mem_map
130
- max_addr_val , max_bit_val = 2 ** mem .addrwidth , 2 ** mem .bitwidth
131
- for (addr , val ) in mem_map .items ():
132
- if addr < 0 or addr >= max_addr_val :
133
- raise PyrtlError ('error, address %s in %s outside of bounds' %
134
- (str (addr ), mem .name ))
135
- if val < 0 or val >= max_bit_val :
136
- raise PyrtlError ('error, %s at %s in %s outside of bounds' %
137
- (str (val ), str (addr ), mem .name ))
127
+ for (mem , mem_map ) in memory_value_map .items ():
128
+ if isinstance (mem , RomBlock ):
129
+ raise PyrtlError ('error, one or more of the memories in the map is a RomBlock' )
130
+ if isinstance (self .block , PostSynthBlock ):
131
+ mem = self .block .mem_map [mem ] # pylint: disable=maybe-no-member
132
+ self .memvalue [mem .id ] = mem_map
133
+ max_addr_val , max_bit_val = 2 ** mem .addrwidth , 2 ** mem .bitwidth
134
+ for (addr , val ) in mem_map .items ():
135
+ if addr < 0 or addr >= max_addr_val :
136
+ raise PyrtlError ('error, address %s in %s outside of bounds' %
137
+ (str (addr ), mem .name ))
138
+ if val < 0 or val >= max_bit_val :
139
+ raise PyrtlError ('error, %s at %s in %s outside of bounds' %
140
+ (str (val ), str (addr ), mem .name ))
138
141
139
142
# set all other variables to default value
140
143
for w in self .block .wirevector_set :
@@ -437,7 +440,7 @@ class FastSimulation(object):
437
440
# when put into the generated code
438
441
439
442
def __init__ (
440
- self , register_value_map = None , memory_value_map = None ,
443
+ self , register_value_map = {} , memory_value_map = {} ,
441
444
default_value = 0 , tracer = True , block = None , code_file = None ):
442
445
""" Instantiates a Fast Simulation instance.
443
446
@@ -469,17 +472,17 @@ def __init__(
469
472
self .internal_names = _PythonSanitizer ('_fastsim_tmp_' )
470
473
self ._initialize (register_value_map , memory_value_map )
471
474
472
- def _initialize (self , register_value_map = None , memory_value_map = None ):
473
- if register_value_map is None :
474
- register_value_map = {}
475
-
475
+ def _initialize (self , register_value_map = {}, memory_value_map = {}):
476
476
for wire in self .block .wirevector_set :
477
477
self .internal_names .make_valid_string (wire .name )
478
478
479
479
# set registers to their values
480
480
reg_set = self .block .wirevector_subset (Register )
481
481
for r in reg_set :
482
- self .regs [r .name ] = register_value_map .get (r , self .default_value )
482
+ rval = register_value_map .get (r , r .reset_value )
483
+ if rval is None :
484
+ rval = self .default_value
485
+ self .regs [r .name ] = rval
483
486
484
487
self ._initialize_mems (memory_value_map )
485
488
@@ -497,12 +500,11 @@ def _initialize(self, register_value_map=None, memory_value_map=None):
497
500
self .sim_func = context ['sim_func' ]
498
501
499
502
def _initialize_mems (self , memory_value_map ):
500
- if memory_value_map is not None :
501
- for (mem , mem_map ) in memory_value_map .items ():
502
- if isinstance (mem , RomBlock ):
503
- raise PyrtlError ('error, one or more of the memories in the map is a RomBlock' )
504
- name = self ._mem_varname (mem )
505
- self .mems [name ] = mem_map
503
+ for (mem , mem_map ) in memory_value_map .items ():
504
+ if isinstance (mem , RomBlock ):
505
+ raise PyrtlError ('error, one or more of the memories in the map is a RomBlock' )
506
+ name = self ._mem_varname (mem )
507
+ self .mems [name ] = mem_map
506
508
507
509
for net in self .block .logic_subset ('m@' ):
508
510
mem = net .op_param [1 ]
@@ -1227,7 +1229,7 @@ def _set_initial_values(self, default_value, init_regvalue, init_memvalue):
1227
1229
1228
1230
:param default_value: Default value to be used for all registers and
1229
1231
memory locations if not found in the other passed in maps
1230
- :param init_regvalue: Default value for registers
1232
+ :param init_regvalue: Default value for all the registers
1231
1233
:param init_memvvalue: Default value for memory locations of given maps
1232
1234
1233
1235
This is needed when using this trace for outputting a Verilog testbench,
0 commit comments