[myhdl-list] [PATCH 2 of 2 V2] toVHDL: add support for negative indexes
Brought to you by:
jandecaluwe
From: Angel E. <ang...@gm...> - 2012-10-13 16:33:06
|
# HG changeset patch # User Angel Ezquerra <ang...@gm...> # Date 1350086923 -7200 # Branch 0.8-dev # Node ID b8fa9fcfe7f2f4712c64b98da346191f57fef193 # Parent c641c1ed333d6d03d9cee4a63df5111fe98574c8 toVHDL: add support for negative indexes This patch tries to detect negative indexes and converts them into indexes relative to the highest bit position (with -1 corresponding to the highest bit). This is similar to what Python does with negative indexes for regular lists. Two types of "negative indexes" are supported with this patch: - Explicit negative numbers (e.g. -1, -3, etc) - Explicit negative unary operator surrounding any other operation (e.g. -(2 * 3)) Other cases in which the index may be negative are not detected. Negative indexes are not supported for slices either (yet), just for simple one bit index accesses. Despite these limitations I think that this functionality can be quite useful. As an example, the following simple test case converts fine with this patch: ~~~ #!/usr/env python from myhdl import * def test_module(rst, clk): '''This block generates the radio frame synchronization signal''' s_output = Signal(intbv(0)[16:]) s_input = Signal(intbv(0)[16:]) @always(clk.posedge, rst.posedge) def p_process(): if rst == 1: s_input[-1] = 1 s_input[-(3*2)] = 1 s_output.next[-2] = s_input[-3] else: pass return instances() clk, rst = [Signal(bool()) for n in range(2)] if __name__ == '__main__': sync_inst = toVHDL(test_module3, rst, clk) ~~~ diff --git a/myhdl/conversion/_toVHDL.py b/myhdl/conversion/_toVHDL.py --- a/myhdl/conversion/_toVHDL.py +++ b/myhdl/conversion/_toVHDL.py @@ -1293,6 +1293,19 @@ self.visit(node.value) self.write("(") #assert len(node.subs) == 1 + + def isnegativeindex(astvalue): + if isinstance(astvalue, ast.Num): + if astvalue.value < 0: + return True + elif isinstance(astvalue, ast.UnaryOp): + if isinstance(astvalue.op, ast.USub): + return True + return False + if isnegativeindex(node.slice.value): + # convert negative indexes into indexes from the MSB + self.write('%d + ' % node.value.obj._nrbits) + self.visit(node.slice.value) self.write(")") self.write(suf) |