Skip to content

Commit 8a7bf00

Browse files
committed
Boundary condition check for math.log operator applied to 0.
1 parent 9800ccd commit 8a7bf00

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

veriloggen/stream/stream.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ def implement(self, m=None, clock=None, reset=None, aswire=None, seq_name=None):
247247
def add_dump(self, m, seq, input_vars, output_vars, all_vars):
248248
pipeline_depth = self.pipeline_depth()
249249
log_pipeline_depth = max(
250-
int(math.ceil(math.log(pipeline_depth, 10))), 1)
250+
int(math.ceil(math.log(max(pipeline_depth, 10), 10))), 1)
251251

252252
seq(
253253
self.dump_step(1)

veriloggen/stream/stypes.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,10 +1025,6 @@ def _set_attributes(self):
10251025
self.signed = False
10261026

10271027
def _implement(self, m, seq, svalid=None, senable=None):
1028-
if self.latency != 1:
1029-
raise ValueError("Latency mismatch '%d' vs '%s'" %
1030-
(self.latency, 1))
1031-
10321028
width = self.bit_length()
10331029
signed = False
10341030

@@ -2718,10 +2714,29 @@ def _implement(self, m, seq, svalid=None, senable=None):
27182714
signed = self.get_signed()
27192715
rdata = self.output_var.read()
27202716

2721-
data = m.Reg(self.name('data'), width, initval=0, signed=signed)
2722-
self.sig_data = data
2717+
if self.latency == 0:
2718+
data = m.Wire(self.name('data'), width, signed=signed)
2719+
data.assign(rdata)
2720+
self.sig_data = data
27232721

2724-
seq(data(rdata), cond=senable)
2722+
elif self.latency == 1:
2723+
data = m.Reg(self.name('data'), width, initval=0, signed=signed)
2724+
self.sig_data = data
2725+
seq(data(rdata), cond=senable)
2726+
2727+
else:
2728+
prev_data = None
2729+
2730+
for i in range(self.latency):
2731+
data = m.Reg(self.name('data_d%d' % i),
2732+
width, initval=0, signed=signed)
2733+
if i == 0:
2734+
seq(data(rdata), cond=senable)
2735+
else:
2736+
seq(data(prev_data), cond=senable)
2737+
prev_data = data
2738+
2739+
self.sig_data = data
27252740

27262741

27272742
class RingBuffer(_UnaryOperator):

veriloggen/thread/stream.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,7 @@ def run(self, fsm):
10611061
if sub.substrm.sink_wait_count is None:
10621062
sub.substrm.sink_wait_count = sub.substrm.module.Reg(
10631063
'_'.join(['', sub.substrm.name, 'sink_wait_count']),
1064-
int(math.ceil(math.log(num_wdelay, 2))), initval=0)
1064+
int(math.ceil(math.log(max(num_wdelay, 2), 2))), initval=0)
10651065

10661066
sub.substrm.fsm.seq.If(sub.substrm.sink_wait_count == 1,
10671067
vtypes.Not(start_cond),
@@ -1085,7 +1085,7 @@ def run(self, fsm):
10851085
if self.sink_wait_count is None:
10861086
self.sink_wait_count = self.module.Reg(
10871087
'_'.join(['', self.name, 'sink_wait_count']),
1088-
int(math.ceil(math.log(num_wdelay, 2))), initval=0)
1088+
int(math.ceil(math.log(max(num_wdelay, 2), 2))), initval=0)
10891089

10901090
self.fsm.seq.If(self.sink_wait_count == 1,
10911091
vtypes.Not(start_cond),
@@ -1213,7 +1213,7 @@ def _setup_source_ram(self, ram, var, port, set_cond):
12131213
def _setup_source_ram_dump(self, ram, var, read_enable, read_data):
12141214
pipeline_depth = self.pipeline_depth()
12151215
log_pipeline_depth = max(
1216-
int(math.ceil(math.log(pipeline_depth, 10))), 1)
1216+
int(math.ceil(math.log(max(pipeline_depth, 10), 10))), 1)
12171217

12181218
addr_base = (ram.dump_addr_base if hasattr(ram, 'dump_addr_base') else
12191219
self.dump_base)
@@ -1451,7 +1451,7 @@ def _make_source_multipattern_vars(self, var, name):
14511451

14521452
var.source_multipat_num_patterns = self.module.Reg(
14531453
'_source_%s_multipat_num_patterns' % prefix,
1454-
int(math.ceil(math.log(self.max_multipattern_length, 2))), initval=0)
1454+
int(math.ceil(math.log(max(self.max_multipattern_length, 2), 2))), initval=0)
14551455
var.source_multipat_offsets = [
14561456
self.module.Reg('_source_%s_multipat_%d_offset' % (prefix, j),
14571457
self.addrwidth, initval=0)
@@ -1661,7 +1661,7 @@ def _setup_sink_ram(self, ram, var, port, set_cond):
16611661
def _setup_sink_ram_dump(self, ram, var, write_enable):
16621662
pipeline_depth = self.pipeline_depth()
16631663
log_pipeline_depth = max(
1664-
int(math.ceil(math.log(pipeline_depth, 10))), 1)
1664+
int(math.ceil(math.log(max(pipeline_depth, 10), 10))), 1)
16651665

16661666
addr_base = (ram.dump_addr_base if hasattr(ram, 'dump_addr_base') else
16671667
self.dump_base)
@@ -1886,7 +1886,7 @@ def _make_sink_multipattern_vars(self, var, name):
18861886

18871887
var.sink_multipat_num_patterns = self.module.Reg(
18881888
'_sink_%s_multipat_num_patterns' % prefix,
1889-
int(math.ceil(math.log(self.max_multipattern_length, 2))), initval=0)
1889+
int(math.ceil(math.log(max(self.max_multipattern_length, 2), 2))), initval=0)
18901890
var.sink_multipat_offsets = [
18911891
self.module.Reg('_sink_%s_multipat_%d_offset' % (prefix, j),
18921892
self.addrwidth, initval=0)

0 commit comments

Comments
 (0)