HDLRuby 2.5.1 → 2.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/HDLRuby/hdr_samples/adder.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +1 -1
- data/lib/HDLRuby/hdr_samples/comparison_bench.rb +40 -0
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +27 -0
- data/lib/HDLRuby/hdr_samples/dff_unit.rb +3 -3
- data/lib/HDLRuby/hdr_samples/huge_rom.rb +25 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +21 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/multi_timed_bench.rb +54 -0
- data/lib/HDLRuby/hdr_samples/music.rb +79 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +42 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +16 -0
- data/lib/HDLRuby/hdr_samples/type_minmax_bench.rb +37 -0
- data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
- data/lib/HDLRuby/hdr_samples/with_to_array.rb +29 -0
- data/lib/HDLRuby/hdrcc.rb +69 -9
- data/lib/HDLRuby/hruby_decorator.rb +3 -1
- data/lib/HDLRuby/hruby_high.rb +220 -29
- data/lib/HDLRuby/hruby_low.rb +433 -45
- data/lib/HDLRuby/hruby_low2c.rb +122 -168
- data/lib/HDLRuby/hruby_low2hdr.rb +738 -0
- data/lib/HDLRuby/hruby_low2high.rb +331 -549
- data/lib/HDLRuby/hruby_low2vhd.rb +39 -2
- data/lib/HDLRuby/hruby_low_bool2select.rb +29 -0
- data/lib/HDLRuby/hruby_low_casts_without_expression.rb +27 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +25 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +70 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +28 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +6 -3
- data/lib/HDLRuby/hruby_low_without_namespace.rb +7 -4
- data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
- data/lib/HDLRuby/hruby_tools.rb +11 -1
- data/lib/HDLRuby/hruby_verilog.rb +1572 -1723
- data/lib/HDLRuby/sim/hruby_sim.h +45 -5
- data/lib/HDLRuby/sim/hruby_sim_calc.c +192 -20
- data/lib/HDLRuby/sim/hruby_sim_core.c +24 -9
- data/lib/HDLRuby/sim/hruby_sim_vcd.c +7 -3
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +22 -6
- data/lib/HDLRuby/std/fixpoint.rb +9 -0
- data/lib/HDLRuby/std/function_generator.rb +139 -0
- data/lib/HDLRuby/std/hruby_unit.rb +75 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +18 -6
- data/lib/HDLRuby/hruby_unit.rb +0 -43
    
        data/lib/HDLRuby/hruby_low.rb
    CHANGED
    
    | @@ -1276,6 +1276,18 @@ module HDLRuby::Low | |
| 1276 1276 | 
             
                        end
         | 
| 1277 1277 | 
             
                    end
         | 
| 1278 1278 |  | 
| 1279 | 
            +
                    # Gets the type max value if any.
         | 
| 1280 | 
            +
                    # Default: not defined.
         | 
| 1281 | 
            +
                    def max
         | 
| 1282 | 
            +
                        raise AnyError, "No max value for type #{self}"
         | 
| 1283 | 
            +
                    end
         | 
| 1284 | 
            +
             | 
| 1285 | 
            +
                    # Gets the type min value if any.
         | 
| 1286 | 
            +
                    # Default: not defined.
         | 
| 1287 | 
            +
                    def min
         | 
| 1288 | 
            +
                        raise AnyError, "No min value for type #{self}"
         | 
| 1289 | 
            +
                    end
         | 
| 1290 | 
            +
             | 
| 1279 1291 | 
             
                    # Get the direction of the type, little or big endian.
         | 
| 1280 1292 | 
             
                    def direction
         | 
| 1281 1293 | 
             
                        # By default, little endian.
         | 
| @@ -1317,6 +1329,11 @@ module HDLRuby::Low | |
| 1317 1329 | 
             
                        return false
         | 
| 1318 1330 | 
             
                    end
         | 
| 1319 1331 |  | 
| 1332 | 
            +
                    # Tells if the type is hierarchical.
         | 
| 1333 | 
            +
                    def hierarchical?
         | 
| 1334 | 
            +
                        return self.base? || self.types?
         | 
| 1335 | 
            +
                    end
         | 
| 1336 | 
            +
             | 
| 1320 1337 | 
             
                    # Tell if +type+ is equivalent to current type.
         | 
| 1321 1338 | 
             
                    #
         | 
| 1322 1339 | 
             
                    # NOTE: type can be compatible while not being equivalent, please
         | 
| @@ -1359,10 +1376,6 @@ module HDLRuby::Low | |
| 1359 1376 | 
             
                # The void type.
         | 
| 1360 1377 | 
             
                class << (Void = Type.new(:void) )
         | 
| 1361 1378 | 
             
                    include LLeaf
         | 
| 1362 | 
            -
                    # # Get the base type, actually self for leaf types.
         | 
| 1363 | 
            -
                    # def base
         | 
| 1364 | 
            -
                    #     self
         | 
| 1365 | 
            -
                    # end
         | 
| 1366 1379 | 
             
                end
         | 
| 1367 1380 |  | 
| 1368 1381 | 
             
                ##
         | 
| @@ -1465,6 +1478,11 @@ module HDLRuby::Low | |
| 1465 1478 | 
             
                    # end
         | 
| 1466 1479 | 
             
                end
         | 
| 1467 1480 |  | 
| 1481 | 
            +
                ##
         | 
| 1482 | 
            +
                # The void type.
         | 
| 1483 | 
            +
                class << (StringT = Type.new(:string) )
         | 
| 1484 | 
            +
                    include LLeaf
         | 
| 1485 | 
            +
                end
         | 
| 1468 1486 |  | 
| 1469 1487 |  | 
| 1470 1488 | 
             
                ##
         | 
| @@ -1473,9 +1491,6 @@ module HDLRuby::Low | |
| 1473 1491 | 
             
                # NOTE: type definition are actually type with a name refering to another
         | 
| 1474 1492 | 
             
                #       type (and equivalent to it).
         | 
| 1475 1493 | 
             
                class TypeDef < Type
         | 
| 1476 | 
            -
                    # Moved to constructor
         | 
| 1477 | 
            -
                    # extend Forwardable
         | 
| 1478 | 
            -
             | 
| 1479 1494 | 
             
                    # The definition of the type.
         | 
| 1480 1495 | 
             
                    attr_reader :def
         | 
| 1481 1496 |  | 
| @@ -1533,15 +1548,6 @@ module HDLRuby::Low | |
| 1533 1548 |  | 
| 1534 1549 | 
             
                    alias_method :each_deep, :each_type_deep
         | 
| 1535 1550 |  | 
| 1536 | 
            -
                    # Moved to constructor
         | 
| 1537 | 
            -
                    # # Delegate the type methods to the ref.
         | 
| 1538 | 
            -
                    # def_delegators :@def,
         | 
| 1539 | 
            -
                    #                :signed?, :unsigned?, :fixed?, :float?, :leaf?,
         | 
| 1540 | 
            -
                    #                :width, :range?, :range, :base?, :base, :types?,
         | 
| 1541 | 
            -
                    #                :get_all_types, :get_type, :each, :each_type, 
         | 
| 1542 | 
            -
                    #                :regular?,
         | 
| 1543 | 
            -
                    #                :each_name,
         | 
| 1544 | 
            -
                    #                :equivalent?
         | 
| 1545 1551 | 
             
                end
         | 
| 1546 1552 |  | 
| 1547 1553 |  | 
| @@ -1623,6 +1629,25 @@ module HDLRuby::Low | |
| 1623 1629 | 
             
                        return @base.width * ((first-last).abs + 1)
         | 
| 1624 1630 | 
             
                    end
         | 
| 1625 1631 |  | 
| 1632 | 
            +
                    # Gets the type max value if any.
         | 
| 1633 | 
            +
                    def max
         | 
| 1634 | 
            +
                        if (self.signed?) then
         | 
| 1635 | 
            +
                            return (2**(self.width-1))-1
         | 
| 1636 | 
            +
                        else
         | 
| 1637 | 
            +
                            return (2**(self.width))-1
         | 
| 1638 | 
            +
                        end
         | 
| 1639 | 
            +
                    end
         | 
| 1640 | 
            +
             | 
| 1641 | 
            +
                    # Gets the type min value if any.
         | 
| 1642 | 
            +
                    # Default: not defined.
         | 
| 1643 | 
            +
                    def min
         | 
| 1644 | 
            +
                        if (self.signed?) then
         | 
| 1645 | 
            +
                            return -(2**(self.width-1))
         | 
| 1646 | 
            +
                        else
         | 
| 1647 | 
            +
                            return 0
         | 
| 1648 | 
            +
                        end
         | 
| 1649 | 
            +
                    end
         | 
| 1650 | 
            +
             | 
| 1626 1651 | 
             
                    # Get the direction of the type, little or big endian.
         | 
| 1627 1652 | 
             
                    def direction
         | 
| 1628 1653 | 
             
                        return @range.first < @range.last ? :big : :little
         | 
| @@ -2401,6 +2426,12 @@ module HDLRuby::Low | |
| 2401 2426 | 
             
                        end
         | 
| 2402 2427 | 
             
                    end
         | 
| 2403 2428 |  | 
| 2429 | 
            +
                    # Tells if the signal is immutable (cannot be written.)
         | 
| 2430 | 
            +
                    def immutable?
         | 
| 2431 | 
            +
                        # By default, signals are not immutable.
         | 
| 2432 | 
            +
                        false
         | 
| 2433 | 
            +
                    end
         | 
| 2434 | 
            +
             | 
| 2404 2435 | 
             
                    # Add decorator capability (modifies intialize to put after).
         | 
| 2405 2436 | 
             
                    include Hdecorator
         | 
| 2406 2437 |  | 
| @@ -2445,6 +2476,11 @@ module HDLRuby::Low | |
| 2445 2476 | 
             
                ##
         | 
| 2446 2477 | 
             
                # Describes a constant signal.
         | 
| 2447 2478 | 
             
                class SignalC < SignalI
         | 
| 2479 | 
            +
                    # Tells if the signal is immutable (cannot be written.)
         | 
| 2480 | 
            +
                    def immutable?
         | 
| 2481 | 
            +
                        # Constant signals are immutable.
         | 
| 2482 | 
            +
                        true
         | 
| 2483 | 
            +
                    end
         | 
| 2448 2484 | 
             
                end
         | 
| 2449 2485 |  | 
| 2450 2486 | 
             
                ## 
         | 
| @@ -2802,6 +2838,15 @@ module HDLRuby::Low | |
| 2802 2838 | 
             
                            "Internal error: hash is not defined for class: #{self.class}"
         | 
| 2803 2839 | 
             
                    end
         | 
| 2804 2840 |  | 
| 2841 | 
            +
                    # Iterates over each sub statement if any.
         | 
| 2842 | 
            +
                    #
         | 
| 2843 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 2844 | 
            +
                    def each_statement(&ruby_block)
         | 
| 2845 | 
            +
                        # No ruby statement? Return an enumerator.
         | 
| 2846 | 
            +
                        return to_enum(:each_statement) unless ruby_block
         | 
| 2847 | 
            +
                        # By default: nothing to do.
         | 
| 2848 | 
            +
                    end
         | 
| 2849 | 
            +
             | 
| 2805 2850 | 
             
                    # Get the block of the statement.
         | 
| 2806 2851 | 
             
                    def block
         | 
| 2807 2852 | 
             
                        if self.is_a?(Block)
         | 
| @@ -3114,7 +3159,24 @@ module HDLRuby::Low | |
| 3114 3159 | 
             
                        end
         | 
| 3115 3160 | 
             
                    end
         | 
| 3116 3161 |  | 
| 3162 | 
            +
                    # Iterates over each sub statement if any.
         | 
| 3163 | 
            +
                    #
         | 
| 3164 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 3165 | 
            +
                    def each_statement(&ruby_block)
         | 
| 3166 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3167 | 
            +
                        return to_enum(:each_statement) unless ruby_block
         | 
| 3168 | 
            +
                        # A ruby block?
         | 
| 3169 | 
            +
                        # Appy it on the statement children.
         | 
| 3170 | 
            +
                        ruby_block.call(@yes)
         | 
| 3171 | 
            +
                        self.each_noif do |next_cond,next_yes|
         | 
| 3172 | 
            +
                            ruby_block.call(next_yes)
         | 
| 3173 | 
            +
                        end
         | 
| 3174 | 
            +
                        ruby_block.call(@no) if @no
         | 
| 3175 | 
            +
                    end
         | 
| 3176 | 
            +
             | 
| 3117 3177 | 
             
                    # Iterates over the children (including the condition).
         | 
| 3178 | 
            +
                    #
         | 
| 3179 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 3118 3180 | 
             
                    def each_node(&ruby_block)
         | 
| 3119 3181 | 
             
                        # No ruby block? Return an enumerator.
         | 
| 3120 3182 | 
             
                        return to_enum(:each_node) unless ruby_block
         | 
| @@ -3271,6 +3333,17 @@ module HDLRuby::Low | |
| 3271 3333 | 
             
                        return When.new(@match.clone,@statement.clone)
         | 
| 3272 3334 | 
             
                    end
         | 
| 3273 3335 |  | 
| 3336 | 
            +
                    # Iterates over each sub statement if any.
         | 
| 3337 | 
            +
                    #
         | 
| 3338 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 3339 | 
            +
                    def each_statement(&ruby_block)
         | 
| 3340 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3341 | 
            +
                        return to_enum(:each_statement) unless ruby_block
         | 
| 3342 | 
            +
                        # A ruby block?
         | 
| 3343 | 
            +
                        # Appy it on the statement child.
         | 
| 3344 | 
            +
                        ruby_block.call(@statement)
         | 
| 3345 | 
            +
                    end
         | 
| 3346 | 
            +
             | 
| 3274 3347 | 
             
                    # Iterates over the sub blocks.
         | 
| 3275 3348 | 
             
                    def each_block(&ruby_block)
         | 
| 3276 3349 | 
             
                        # No ruby block? Return an enumerator.
         | 
| @@ -3321,7 +3394,8 @@ module HDLRuby::Low | |
| 3321 3394 |  | 
| 3322 3395 | 
             
                    # Gets the top block, i.e. the first block of the current behavior.
         | 
| 3323 3396 | 
             
                    def top_block
         | 
| 3324 | 
            -
                        return self.parent.is_a?(Behavior) ? self : self.parent.top_block
         | 
| 3397 | 
            +
                        # return self.parent.is_a?(Behavior) ? self : self.parent.top_block
         | 
| 3398 | 
            +
                        return self.parent.top_block
         | 
| 3325 3399 | 
             
                    end
         | 
| 3326 3400 |  | 
| 3327 3401 | 
             
                    # Tell if the statement includes a signal whose name is one of +names+.
         | 
| @@ -3425,6 +3499,19 @@ module HDLRuby::Low | |
| 3425 3499 | 
             
                        @default
         | 
| 3426 3500 | 
             
                    end
         | 
| 3427 3501 |  | 
| 3502 | 
            +
                    # Iterates over each sub statement if any.
         | 
| 3503 | 
            +
                    #
         | 
| 3504 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 3505 | 
            +
                    def each_statement(&ruby_block)
         | 
| 3506 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3507 | 
            +
                        return to_enum(:each_statement) unless ruby_block
         | 
| 3508 | 
            +
                        # A ruby block?
         | 
| 3509 | 
            +
                        # Apply on each when.
         | 
| 3510 | 
            +
                        @whens.each { |w| w.each_statement(&ruby_block) }
         | 
| 3511 | 
            +
                        # And on the default if any.
         | 
| 3512 | 
            +
                        ruby_block.call(@default) if @default
         | 
| 3513 | 
            +
                    end
         | 
| 3514 | 
            +
             | 
| 3428 3515 | 
             
                    # Iterates over the match cases.
         | 
| 3429 3516 | 
             
                    #
         | 
| 3430 3517 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -3571,6 +3658,122 @@ module HDLRuby::Low | |
| 3571 3658 | 
             
                end
         | 
| 3572 3659 |  | 
| 3573 3660 |  | 
| 3661 | 
            +
                ## 
         | 
| 3662 | 
            +
                # Describes a print statement: not synthesizable!
         | 
| 3663 | 
            +
                class Print < Statement
         | 
| 3664 | 
            +
             | 
| 3665 | 
            +
                    # Creates a new statement for printing +args+.
         | 
| 3666 | 
            +
                    def initialize(*args)
         | 
| 3667 | 
            +
                        super()
         | 
| 3668 | 
            +
                        # Process the arguments.
         | 
| 3669 | 
            +
                        @args = args.map do |arg|
         | 
| 3670 | 
            +
                            arg.parent = self 
         | 
| 3671 | 
            +
                            arg
         | 
| 3672 | 
            +
                        end
         | 
| 3673 | 
            +
                    end
         | 
| 3674 | 
            +
             | 
| 3675 | 
            +
                    # Comparison for hash: structural comparison.
         | 
| 3676 | 
            +
                    def eql?(obj)
         | 
| 3677 | 
            +
                        return false unless obj.is_a?(Print)
         | 
| 3678 | 
            +
                        return false if @args.each.zip(obj.each_arg).any? do |a0,a1|
         | 
| 3679 | 
            +
                            !a0.eql?(a1)
         | 
| 3680 | 
            +
                        end
         | 
| 3681 | 
            +
                        return true
         | 
| 3682 | 
            +
                    end
         | 
| 3683 | 
            +
             | 
| 3684 | 
            +
                    # Iterates over each argument.
         | 
| 3685 | 
            +
                    #
         | 
| 3686 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 3687 | 
            +
                    def each_arg(&ruby_block)
         | 
| 3688 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3689 | 
            +
                        return to_enum(:each_arg) unless ruby_block
         | 
| 3690 | 
            +
                        # A ruby block? First apply it to each argument.
         | 
| 3691 | 
            +
                        @args.each(&ruby_block)
         | 
| 3692 | 
            +
                    end
         | 
| 3693 | 
            +
             | 
| 3694 | 
            +
                    # Iterates over each object deeply.
         | 
| 3695 | 
            +
                    #
         | 
| 3696 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 3697 | 
            +
                    def each_deep(&ruby_block)
         | 
| 3698 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3699 | 
            +
                        return to_enum(:each_deep) unless ruby_block
         | 
| 3700 | 
            +
                        # A ruby block? First apply it to current.
         | 
| 3701 | 
            +
                        ruby_block.call(self)
         | 
| 3702 | 
            +
                        # Then apply on the arguments.
         | 
| 3703 | 
            +
                        self.each_arg(&ruby_block)
         | 
| 3704 | 
            +
                    end
         | 
| 3705 | 
            +
             | 
| 3706 | 
            +
                    # Hash function.
         | 
| 3707 | 
            +
                    def hash
         | 
| 3708 | 
            +
                        return @args.hash
         | 
| 3709 | 
            +
                    end
         | 
| 3710 | 
            +
             | 
| 3711 | 
            +
                    # Clones the TimeWait (deeply)
         | 
| 3712 | 
            +
                    def clone
         | 
| 3713 | 
            +
                        return Print.new(*@args.map { |arg| arg.clone })
         | 
| 3714 | 
            +
                    end
         | 
| 3715 | 
            +
             | 
| 3716 | 
            +
                    # Iterates over the expression children if any.
         | 
| 3717 | 
            +
                    def each_node(&ruby_block)
         | 
| 3718 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3719 | 
            +
                        return to_enum(:each_node) unless ruby_block
         | 
| 3720 | 
            +
                        # A ruby block?
         | 
| 3721 | 
            +
                        # Apply it on each argument.
         | 
| 3722 | 
            +
                        @args.each(&ruby_block)
         | 
| 3723 | 
            +
                    end
         | 
| 3724 | 
            +
             | 
| 3725 | 
            +
                    # Iterates over the nodes deeply if any.
         | 
| 3726 | 
            +
                    def each_node_deep(&ruby_block)
         | 
| 3727 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3728 | 
            +
                        return to_enum(:each_node_deep) unless ruby_block
         | 
| 3729 | 
            +
                        # A ruby block? First apply it to current.
         | 
| 3730 | 
            +
                        ruby_block.call(self)
         | 
| 3731 | 
            +
                        # And apply it on each argument.
         | 
| 3732 | 
            +
                        @args.each(&ruby_block)
         | 
| 3733 | 
            +
                    end
         | 
| 3734 | 
            +
             | 
| 3735 | 
            +
                    # Iterates over the sub blocks.
         | 
| 3736 | 
            +
                    def each_block(&ruby_block)
         | 
| 3737 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3738 | 
            +
                        return to_enum(:each_block) unless ruby_block
         | 
| 3739 | 
            +
                        # A ruby block?
         | 
| 3740 | 
            +
                        # Recurse on each argument.
         | 
| 3741 | 
            +
                        @args.each do |arg|
         | 
| 3742 | 
            +
                            arg.each_block(&ruby_block) if arg.respond_to?(:each_block)
         | 
| 3743 | 
            +
                        end
         | 
| 3744 | 
            +
                    end
         | 
| 3745 | 
            +
             | 
| 3746 | 
            +
                    # Iterates over all the blocks contained in the current block.
         | 
| 3747 | 
            +
                    def each_block_deep(&ruby_block)
         | 
| 3748 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3749 | 
            +
                        return to_enum(:each_block_deep) unless ruby_block
         | 
| 3750 | 
            +
                        # A ruby block?
         | 
| 3751 | 
            +
                        # Recurse on each argument.
         | 
| 3752 | 
            +
                        @args.each do |arg|
         | 
| 3753 | 
            +
                            if arg.respond_to?(:each_block_deep) then
         | 
| 3754 | 
            +
                                arg.each_block_deep(&ruby_block)
         | 
| 3755 | 
            +
                            end
         | 
| 3756 | 
            +
                        end
         | 
| 3757 | 
            +
                    end
         | 
| 3758 | 
            +
             | 
| 3759 | 
            +
                    # Iterates over all the statements contained in the current block.
         | 
| 3760 | 
            +
                    def each_statement_deep(&ruby_block)
         | 
| 3761 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 3762 | 
            +
                        return to_enum(:each_statement_deep) unless ruby_block
         | 
| 3763 | 
            +
                        # A ruby block?
         | 
| 3764 | 
            +
                        # Apply it on self.
         | 
| 3765 | 
            +
                        ruby_block.call(self)
         | 
| 3766 | 
            +
                        # Recurse on each argument.
         | 
| 3767 | 
            +
                        @args.each do |arg|
         | 
| 3768 | 
            +
                            if arg.respond_to?(:each_statement_deep) then
         | 
| 3769 | 
            +
                                arg.each_statement_deep(&ruby_block)
         | 
| 3770 | 
            +
                            end
         | 
| 3771 | 
            +
                        end
         | 
| 3772 | 
            +
                    end
         | 
| 3773 | 
            +
             | 
| 3774 | 
            +
                end
         | 
| 3775 | 
            +
             | 
| 3776 | 
            +
             | 
| 3574 3777 | 
             
                ## 
         | 
| 3575 3778 | 
             
                # Describes a wait statement: not synthesizable!
         | 
| 3576 3779 | 
             
                class TimeWait < Statement
         | 
| @@ -3867,7 +4070,6 @@ module HDLRuby::Low | |
| 3867 4070 | 
             
                        # No ruby block? Return an enumerator.
         | 
| 3868 4071 | 
             
                        return to_enum(:each_inner) unless ruby_block
         | 
| 3869 4072 | 
             
                        # A ruby block? Apply it on each inner signal instance.
         | 
| 3870 | 
            -
                        # @inners.each_value(&ruby_block)
         | 
| 3871 4073 | 
             
                        @inners.each(&ruby_block)
         | 
| 3872 4074 | 
             
                    end
         | 
| 3873 4075 | 
             
                    alias_method :each_signal, :each_inner
         | 
| @@ -3958,17 +4160,6 @@ module HDLRuby::Low | |
| 3958 4160 | 
             
                    def last_statement
         | 
| 3959 4161 | 
             
                        return @statements[-1]
         | 
| 3960 4162 | 
             
                    end
         | 
| 3961 | 
            -
             | 
| 3962 | 
            -
                    # # Deletes +statement+.
         | 
| 3963 | 
            -
                    # def delete_statement(statement)
         | 
| 3964 | 
            -
                    #     if @statements.include?(statement) then
         | 
| 3965 | 
            -
                    #         # Statement is present, delete it.
         | 
| 3966 | 
            -
                    #         @statements.delete(statement)
         | 
| 3967 | 
            -
                    #         # And remove its parent.
         | 
| 3968 | 
            -
                    #         statement.parent = nil
         | 
| 3969 | 
            -
                    #     end
         | 
| 3970 | 
            -
                    #     statement
         | 
| 3971 | 
            -
                    # end
         | 
| 3972 4163 |  | 
| 3973 4164 | 
             
                    # Iterates over the sub blocks.
         | 
| 3974 4165 | 
             
                    def each_block(&ruby_block)
         | 
| @@ -4180,6 +4371,11 @@ module HDLRuby::Low | |
| 4180 4371 | 
             
                        return !self.leftvalue?
         | 
| 4181 4372 | 
             
                    end
         | 
| 4182 4373 |  | 
| 4374 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 4375 | 
            +
                    def immutable?
         | 
| 4376 | 
            +
                        false
         | 
| 4377 | 
            +
                    end
         | 
| 4378 | 
            +
             | 
| 4183 4379 | 
             
                    # Iterates over the expression children if any.
         | 
| 4184 4380 | 
             
                    def each_node(&ruby_block)
         | 
| 4185 4381 | 
             
                        # By default: no child.
         | 
| @@ -4235,29 +4431,34 @@ module HDLRuby::Low | |
| 4235 4431 | 
             
                # Describes a value.
         | 
| 4236 4432 | 
             
                class Value < Expression
         | 
| 4237 4433 |  | 
| 4238 | 
            -
                    # Moved to Expression
         | 
| 4239 | 
            -
                    # # The type of value.
         | 
| 4240 | 
            -
                    # attr_reader :type
         | 
| 4241 | 
            -
             | 
| 4242 4434 | 
             
                    # The content of the value.
         | 
| 4243 4435 | 
             
                    attr_reader :content
         | 
| 4244 4436 |  | 
| 4245 4437 | 
             
                    # Creates a new value typed +type+ and containing +content+.
         | 
| 4246 4438 | 
             
                    def initialize(type,content)
         | 
| 4247 | 
            -
                        # Moved to Expression.
         | 
| 4248 | 
            -
                        # # Check and set the type.
         | 
| 4249 | 
            -
                        # if type.is_a?(Type) then
         | 
| 4250 | 
            -
                        #     @type = type
         | 
| 4251 | 
            -
                        # else
         | 
| 4252 | 
            -
                        #     raise AnyError, "Invalid class for a type: #{type.class}."
         | 
| 4253 | 
            -
                        # end
         | 
| 4254 4439 | 
             
                        super(type)
         | 
| 4255 | 
            -
                         | 
| 4256 | 
            -
             | 
| 4257 | 
            -
             | 
| 4258 | 
            -
             | 
| 4440 | 
            +
                        unless content then
         | 
| 4441 | 
            +
                            # Handle the nil content case.
         | 
| 4442 | 
            +
                            unless type.eql?(Void) then
         | 
| 4443 | 
            +
                                raise AnyError, "A value with nil content must have the Void type."
         | 
| 4444 | 
            +
                            end
         | 
| 4445 | 
            +
                            @content = content
         | 
| 4446 | 
            +
                        else
         | 
| 4447 | 
            +
                            # Checks and set the content: Ruby Numeric and HDLRuby
         | 
| 4448 | 
            +
                            # BitString are supported. Strings or equivalent are
         | 
| 4449 | 
            +
                            # converted to BitString.
         | 
| 4450 | 
            +
                            unless content.is_a?(Numeric) or
         | 
| 4451 | 
            +
                                    content.is_a?(HDLRuby::BitString)
         | 
| 4452 | 
            +
                                content = HDLRuby::BitString.new(content.to_s)
         | 
| 4453 | 
            +
                            end
         | 
| 4454 | 
            +
                            @content = content 
         | 
| 4259 4455 | 
             
                        end
         | 
| 4260 | 
            -
             | 
| 4456 | 
            +
                    end
         | 
| 4457 | 
            +
             | 
| 4458 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 4459 | 
            +
                    def immutable?
         | 
| 4460 | 
            +
                        # Values are always immutable.
         | 
| 4461 | 
            +
                        true
         | 
| 4261 4462 | 
             
                    end
         | 
| 4262 4463 |  | 
| 4263 4464 | 
             
                    # Iterates over each object deeply.
         | 
| @@ -4326,6 +4527,7 @@ module HDLRuby::Low | |
| 4326 4527 | 
             
                    end
         | 
| 4327 4528 | 
             
                end
         | 
| 4328 4529 |  | 
| 4530 | 
            +
             | 
| 4329 4531 | 
             
                ##
         | 
| 4330 4532 | 
             
                # Describes a cast.
         | 
| 4331 4533 | 
             
                class Cast < Expression
         | 
| @@ -4345,6 +4547,12 @@ module HDLRuby::Low | |
| 4345 4547 | 
             
                        child.parent = self
         | 
| 4346 4548 | 
             
                    end
         | 
| 4347 4549 |  | 
| 4550 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 4551 | 
            +
                    def immutable?
         | 
| 4552 | 
            +
                        # Immutable if the child is immutable.
         | 
| 4553 | 
            +
                        return child.immutable?
         | 
| 4554 | 
            +
                    end
         | 
| 4555 | 
            +
             | 
| 4348 4556 | 
             
                    # Iterates over each object deeply.
         | 
| 4349 4557 | 
             
                    #
         | 
| 4350 4558 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -4475,6 +4683,12 @@ module HDLRuby::Low | |
| 4475 4683 | 
             
                        child.parent = self
         | 
| 4476 4684 | 
             
                    end
         | 
| 4477 4685 |  | 
| 4686 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 4687 | 
            +
                    def immutable?
         | 
| 4688 | 
            +
                        # Immutable if the child is immutable.
         | 
| 4689 | 
            +
                        return child.immutable?
         | 
| 4690 | 
            +
                    end
         | 
| 4691 | 
            +
             | 
| 4478 4692 | 
             
                    # Iterates over each object deeply.
         | 
| 4479 4693 | 
             
                    #
         | 
| 4480 4694 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -4577,6 +4791,12 @@ module HDLRuby::Low | |
| 4577 4791 | 
             
                        left.parent = right.parent = self
         | 
| 4578 4792 | 
             
                    end
         | 
| 4579 4793 |  | 
| 4794 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 4795 | 
            +
                    def immutable?
         | 
| 4796 | 
            +
                        # Immutable if both children are immutable.
         | 
| 4797 | 
            +
                        return left.immutable? && right.immutable?
         | 
| 4798 | 
            +
                    end
         | 
| 4799 | 
            +
             | 
| 4580 4800 | 
             
                    # Iterates over each object deeply.
         | 
| 4581 4801 | 
             
                    #
         | 
| 4582 4802 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -4688,6 +4908,15 @@ module HDLRuby::Low | |
| 4688 4908 | 
             
                        end
         | 
| 4689 4909 | 
             
                    end
         | 
| 4690 4910 |  | 
| 4911 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 4912 | 
            +
                    def immutable?
         | 
| 4913 | 
            +
                        # Immutable if children are all immutable.
         | 
| 4914 | 
            +
                        return self.select.constant &&
         | 
| 4915 | 
            +
                          self.each_choice.reduce(true) do |r,c|
         | 
| 4916 | 
            +
                            r && c.immutable?
         | 
| 4917 | 
            +
                        end
         | 
| 4918 | 
            +
                    end
         | 
| 4919 | 
            +
             | 
| 4691 4920 | 
             
                    # Iterates over each object deeply.
         | 
| 4692 4921 | 
             
                    #
         | 
| 4693 4922 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -4822,6 +5051,14 @@ module HDLRuby::Low | |
| 4822 5051 | 
             
                        expressions.each { |expression| self.add_expression(expression) }
         | 
| 4823 5052 | 
             
                    end
         | 
| 4824 5053 |  | 
| 5054 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 5055 | 
            +
                    def immutable?
         | 
| 5056 | 
            +
                        # Immutable if children are all immutable.
         | 
| 5057 | 
            +
                        return self.each_expression.reduce(true) do |r,c|
         | 
| 5058 | 
            +
                            r && c.immutable?
         | 
| 5059 | 
            +
                        end
         | 
| 5060 | 
            +
                    end
         | 
| 5061 | 
            +
             | 
| 4825 5062 | 
             
                    # Iterates over each object deeply.
         | 
| 4826 5063 | 
             
                    #
         | 
| 4827 5064 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -4985,6 +5222,14 @@ module HDLRuby::Low | |
| 4985 5222 | 
             
                        refs.each { |ref| ref.parent = self }
         | 
| 4986 5223 | 
             
                    end
         | 
| 4987 5224 |  | 
| 5225 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 5226 | 
            +
                    def immutable?
         | 
| 5227 | 
            +
                        # Immutable if children are all immutable.
         | 
| 5228 | 
            +
                        return self.each_ref.reduce(true) do |r,c|
         | 
| 5229 | 
            +
                            r && c.immutable?
         | 
| 5230 | 
            +
                        end
         | 
| 5231 | 
            +
                    end
         | 
| 5232 | 
            +
             | 
| 4988 5233 | 
             
                    # Iterates over each object deeply.
         | 
| 4989 5234 | 
             
                    #
         | 
| 4990 5235 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -5102,6 +5347,12 @@ module HDLRuby::Low | |
| 5102 5347 | 
             
                        index.parent = self
         | 
| 5103 5348 | 
             
                    end
         | 
| 5104 5349 |  | 
| 5350 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 5351 | 
            +
                    def immutable?
         | 
| 5352 | 
            +
                        # Immutable if the ref is immutable.
         | 
| 5353 | 
            +
                        return self.ref.immutable?
         | 
| 5354 | 
            +
                    end
         | 
| 5355 | 
            +
             | 
| 5105 5356 | 
             
                    # Iterates over each object deeply.
         | 
| 5106 5357 | 
             
                    #
         | 
| 5107 5358 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -5215,6 +5466,12 @@ module HDLRuby::Low | |
| 5215 5466 | 
             
                        first.parent = last.parent = self
         | 
| 5216 5467 | 
             
                    end
         | 
| 5217 5468 |  | 
| 5469 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 5470 | 
            +
                    def immutable?
         | 
| 5471 | 
            +
                        # Immutable if the ref is immutable.
         | 
| 5472 | 
            +
                        return self.ref.immutable?
         | 
| 5473 | 
            +
                    end
         | 
| 5474 | 
            +
             | 
| 5218 5475 | 
             
                    # Iterates over each object deeply.
         | 
| 5219 5476 | 
             
                    #
         | 
| 5220 5477 | 
             
                    # Returns an enumerator if no ruby block is given.
         | 
| @@ -5444,4 +5701,135 @@ module HDLRuby::Low | |
| 5444 5701 | 
             
                        return super
         | 
| 5445 5702 | 
             
                    end
         | 
| 5446 5703 | 
             
                end
         | 
| 5704 | 
            +
             | 
| 5705 | 
            +
             | 
| 5706 | 
            +
             | 
| 5707 | 
            +
                ##
         | 
| 5708 | 
            +
                # Describes a string.
         | 
| 5709 | 
            +
                #
         | 
| 5710 | 
            +
                # NOTE: This is not synthesizable!
         | 
| 5711 | 
            +
                class StringE < Expression
         | 
| 5712 | 
            +
             | 
| 5713 | 
            +
                    attr_reader :content
         | 
| 5714 | 
            +
             | 
| 5715 | 
            +
                    # Creates a new string whose content is +str+ and is modified using
         | 
| 5716 | 
            +
                    # the objects of +args+.
         | 
| 5717 | 
            +
                    def initialize(content,*args)
         | 
| 5718 | 
            +
                        super(StringT)
         | 
| 5719 | 
            +
                        # Checks and set the content.
         | 
| 5720 | 
            +
                        @content = content.to_s
         | 
| 5721 | 
            +
                        # Process the arguments.
         | 
| 5722 | 
            +
                        @args = args.map do |arg|
         | 
| 5723 | 
            +
                            arg.parent = self 
         | 
| 5724 | 
            +
                            arg
         | 
| 5725 | 
            +
                        end
         | 
| 5726 | 
            +
                    end
         | 
| 5727 | 
            +
             | 
| 5728 | 
            +
                    # Tells if the expression is immutable (cannot be written.)
         | 
| 5729 | 
            +
                    def immutable?
         | 
| 5730 | 
            +
                        # String objects are always immutable.
         | 
| 5731 | 
            +
                        true
         | 
| 5732 | 
            +
                    end
         | 
| 5733 | 
            +
             | 
| 5734 | 
            +
                    # Comparison for hash: structural comparison.
         | 
| 5735 | 
            +
                    def eql?(obj)
         | 
| 5736 | 
            +
                        return false unless obj.is_a?(StringE)
         | 
| 5737 | 
            +
                        return false unless @content.eql?(obj.content)
         | 
| 5738 | 
            +
                        return false if @args.each.zip(obj.each_arg).any? do |a0,a1|
         | 
| 5739 | 
            +
                            !a0.eql?(a1)
         | 
| 5740 | 
            +
                        end
         | 
| 5741 | 
            +
                        return true
         | 
| 5742 | 
            +
                    end
         | 
| 5743 | 
            +
             | 
| 5744 | 
            +
                    # Iterates over each argument.
         | 
| 5745 | 
            +
                    #
         | 
| 5746 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 5747 | 
            +
                    def each_arg(&ruby_block)
         | 
| 5748 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 5749 | 
            +
                        return to_enum(:each_arg) unless ruby_block
         | 
| 5750 | 
            +
                        # A ruby block? First apply it to each argument.
         | 
| 5751 | 
            +
                        @args.each(&ruby_block)
         | 
| 5752 | 
            +
                    end
         | 
| 5753 | 
            +
             | 
| 5754 | 
            +
                    # Iterates over each object deeply.
         | 
| 5755 | 
            +
                    #
         | 
| 5756 | 
            +
                    # Returns an enumerator if no ruby block is given.
         | 
| 5757 | 
            +
                    def each_deep(&ruby_block)
         | 
| 5758 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 5759 | 
            +
                        return to_enum(:each_deep) unless ruby_block
         | 
| 5760 | 
            +
                        # A ruby block? First apply it to current.
         | 
| 5761 | 
            +
                        ruby_block.call(self)
         | 
| 5762 | 
            +
                        # Then apply on the arguments.
         | 
| 5763 | 
            +
                        self.each_arg(&ruby_block)
         | 
| 5764 | 
            +
                    end
         | 
| 5765 | 
            +
             | 
| 5766 | 
            +
                    # Hash function.
         | 
| 5767 | 
            +
                    def hash
         | 
| 5768 | 
            +
                        return @args.hash
         | 
| 5769 | 
            +
                    end
         | 
| 5770 | 
            +
             | 
| 5771 | 
            +
                    # Clones the string.
         | 
| 5772 | 
            +
                    def clone
         | 
| 5773 | 
            +
                        return StringE.new(@content.clone,*@args.map {|arg| arg.clone})
         | 
| 5774 | 
            +
                    end
         | 
| 5775 | 
            +
             | 
| 5776 | 
            +
                    # Iterates over the expression children if any.
         | 
| 5777 | 
            +
                    def each_node(&ruby_block)
         | 
| 5778 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 5779 | 
            +
                        return to_enum(:each_node) unless ruby_block
         | 
| 5780 | 
            +
                        # A ruby block?
         | 
| 5781 | 
            +
                        # Apply it on each argument.
         | 
| 5782 | 
            +
                        @args.each(&ruby_block)
         | 
| 5783 | 
            +
                    end
         | 
| 5784 | 
            +
             | 
| 5785 | 
            +
                    # Iterates over the nodes deeply if any.
         | 
| 5786 | 
            +
                    def each_node_deep(&ruby_block)
         | 
| 5787 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 5788 | 
            +
                        return to_enum(:each_node_deep) unless ruby_block
         | 
| 5789 | 
            +
                        # A ruby block? First apply it to current.
         | 
| 5790 | 
            +
                        ruby_block.call(self)
         | 
| 5791 | 
            +
                        # And apply it on each argument.
         | 
| 5792 | 
            +
                        @args.each(&ruby_block)
         | 
| 5793 | 
            +
                    end
         | 
| 5794 | 
            +
             | 
| 5795 | 
            +
                    # Iterates over the sub blocks.
         | 
| 5796 | 
            +
                    def each_block(&ruby_block)
         | 
| 5797 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 5798 | 
            +
                        return to_enum(:each_block) unless ruby_block
         | 
| 5799 | 
            +
                        # A ruby block?
         | 
| 5800 | 
            +
                        # Recurse on each argument.
         | 
| 5801 | 
            +
                        @args.each do |arg|
         | 
| 5802 | 
            +
                            arg.each_block(&ruby_block) if arg.respond_to?(:each_block)
         | 
| 5803 | 
            +
                        end
         | 
| 5804 | 
            +
                    end
         | 
| 5805 | 
            +
             | 
| 5806 | 
            +
                    # Iterates over all the blocks contained in the current block.
         | 
| 5807 | 
            +
                    def each_block_deep(&ruby_block)
         | 
| 5808 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 5809 | 
            +
                        return to_enum(:each_block_deep) unless ruby_block
         | 
| 5810 | 
            +
                        # A ruby block?
         | 
| 5811 | 
            +
                        # Recurse on each argument.
         | 
| 5812 | 
            +
                        @args.each do |arg|
         | 
| 5813 | 
            +
                            if arg.respond_to?(:each_block_deep) then
         | 
| 5814 | 
            +
                                arg.each_block_deep(&ruby_block)
         | 
| 5815 | 
            +
                            end
         | 
| 5816 | 
            +
                        end
         | 
| 5817 | 
            +
                    end
         | 
| 5818 | 
            +
             | 
| 5819 | 
            +
                    # Iterates over all the statements contained in the current block.
         | 
| 5820 | 
            +
                    def each_statement_deep(&ruby_block)
         | 
| 5821 | 
            +
                        # No ruby block? Return an enumerator.
         | 
| 5822 | 
            +
                        return to_enum(:each_statement_deep) unless ruby_block
         | 
| 5823 | 
            +
                        # A ruby block?
         | 
| 5824 | 
            +
                        # Apply it on self.
         | 
| 5825 | 
            +
                        ruby_block.call(self)
         | 
| 5826 | 
            +
                        # Recurse on each argument.
         | 
| 5827 | 
            +
                        @args.each do |arg|
         | 
| 5828 | 
            +
                            if arg.respond_to?(:each_statement_deep) then
         | 
| 5829 | 
            +
                                arg.each_statement_deep(&ruby_block)
         | 
| 5830 | 
            +
                            end
         | 
| 5831 | 
            +
                        end
         | 
| 5832 | 
            +
                    end
         | 
| 5833 | 
            +
             | 
| 5834 | 
            +
                end
         | 
| 5447 5835 | 
             
            end
         |