HDLRuby 2.4.27 → 2.6.2
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/drivers/xcd.rb +79 -0
 - data/lib/HDLRuby/drivers/xcd/dummy.xcd +4 -0
 - 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/constant_in_function.rb +27 -0
 - data/lib/HDLRuby/hdr_samples/dff_properties.rb +19 -0
 - data/lib/HDLRuby/hdr_samples/dff_unit.rb +54 -0
 - 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/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/seqpar_bench.rb +59 -0
 - data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
 - data/lib/HDLRuby/hdrcc.rb +140 -24
 - data/lib/HDLRuby/hruby_decorator.rb +250 -0
 - data/lib/HDLRuby/hruby_high.rb +468 -91
 - data/lib/HDLRuby/hruby_low.rb +913 -45
 - data/lib/HDLRuby/hruby_low2c.rb +189 -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_parinseq.rb +151 -0
 - data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
 - data/lib/HDLRuby/hruby_tools.rb +11 -1
 - data/lib/HDLRuby/hruby_verilog.rb +1602 -1629
 - data/lib/HDLRuby/sim/hruby_sim.h +25 -2
 - data/lib/HDLRuby/sim/hruby_sim_calc.c +63 -6
 - data/lib/HDLRuby/sim/hruby_sim_vcd.c +5 -1
 - 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/template_expander.rb +61 -0
 - data/lib/HDLRuby/version.rb +1 -1
 - metadata +22 -5
 
| 
         @@ -50,6 +50,15 @@ module HDLRuby::Low 
     | 
|
| 
       50 
50 
     | 
    
         
             
                        @@alliance = mode ? true : false
         
     | 
| 
       51 
51 
     | 
    
         
             
                    end
         
     | 
| 
       52 
52 
     | 
    
         | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                    ## Converts string +str+ to a VHDL-compatible string.
         
     | 
| 
      
 55 
     | 
    
         
            +
                    def self.vhdl_string(str)
         
     | 
| 
      
 56 
     | 
    
         
            +
                        str = str.gsub(/\n/,"\\n")
         
     | 
| 
      
 57 
     | 
    
         
            +
                        str.gsub!(/\t/,"\\t")
         
     | 
| 
      
 58 
     | 
    
         
            +
                        return str
         
     | 
| 
      
 59 
     | 
    
         
            +
                    end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
       53 
62 
     | 
    
         
             
                    ## Generates the pakage requirement for an entity.
         
     | 
| 
       54 
63 
     | 
    
         
             
                    #  +spaces+ are the spaces to put before each line.
         
     | 
| 
       55 
64 
     | 
    
         
             
                    def self.packages(spaces)
         
     | 
| 
         @@ -523,7 +532,8 @@ module HDLRuby::Low 
     | 
|
| 
       523 
532 
     | 
    
         
             
                                if inner.value.is_a?(Concat) then
         
     | 
| 
       524 
533 
     | 
    
         
             
                                    # Concat are to be given the expected type of the
         
     | 
| 
       525 
534 
     | 
    
         
             
                                    # elements for casting them equally.
         
     | 
| 
       526 
     | 
    
         
            -
                                    res << " := " << inner.value.to_vhdl(inner.type.base,level)
         
     | 
| 
      
 535 
     | 
    
         
            +
                                    # res << " := " << inner.value.to_vhdl(inner.type.base,level)
         
     | 
| 
      
 536 
     | 
    
         
            +
                                    res << " := " << inner.value.to_vhdl(level,inner.type.base)
         
     | 
| 
       527 
537 
     | 
    
         
             
                                else
         
     | 
| 
       528 
538 
     | 
    
         
             
                                    res << " := " << inner.value.to_vhdl(level)
         
     | 
| 
       529 
539 
     | 
    
         
             
                                end
         
     | 
| 
         @@ -901,6 +911,20 @@ module HDLRuby::Low 
     | 
|
| 
       901 
911 
     | 
    
         
             
                               Low2VHDL.to_type(self.left.type,self.right) + ";\n"
         
     | 
| 
       902 
912 
     | 
    
         
             
                    end
         
     | 
| 
       903 
913 
     | 
    
         
             
                end
         
     | 
| 
      
 914 
     | 
    
         
            +
             
     | 
| 
      
 915 
     | 
    
         
            +
                ## Extends the Print class with generation of HDLRuby::High text.
         
     | 
| 
      
 916 
     | 
    
         
            +
                class Print
         
     | 
| 
      
 917 
     | 
    
         
            +
             
     | 
| 
      
 918 
     | 
    
         
            +
                    # Generates the text of the equivalent HDLRuby::High code.
         
     | 
| 
      
 919 
     | 
    
         
            +
                    # +vars+ is the list of the variables and
         
     | 
| 
      
 920 
     | 
    
         
            +
                    # +level+ is the hierachical level of the object.
         
     | 
| 
      
 921 
     | 
    
         
            +
                    def to_vhdl(vars,level = 0)
         
     | 
| 
      
 922 
     | 
    
         
            +
                        # Generate a report statement.
         
     | 
| 
      
 923 
     | 
    
         
            +
                        return " " * (level*3) + "report " + self.each_arg.map do |arg|
         
     | 
| 
      
 924 
     | 
    
         
            +
                            arg.to_vhdl
         
     | 
| 
      
 925 
     | 
    
         
            +
                        end.join(" & ") + ";\n"
         
     | 
| 
      
 926 
     | 
    
         
            +
                    end
         
     | 
| 
      
 927 
     | 
    
         
            +
                end
         
     | 
| 
       904 
928 
     | 
    
         | 
| 
       905 
929 
     | 
    
         
             
                ## Extends the If class with generation of HDLRuby::High text.
         
     | 
| 
       906 
930 
     | 
    
         
             
                class If
         
     | 
| 
         @@ -1347,7 +1371,8 @@ module HDLRuby::Low 
     | 
|
| 
       1347 
1371 
     | 
    
         
             
                    # Generates the text of the equivalent HDLRuby::High code.
         
     | 
| 
       1348 
1372 
     | 
    
         
             
                    # +type+ is the expected type of the content.
         
     | 
| 
       1349 
1373 
     | 
    
         
             
                    # +level+ is the hierachical level of the object.
         
     | 
| 
       1350 
     | 
    
         
            -
                    def to_vhdl(type,level = 0)
         
     | 
| 
      
 1374 
     | 
    
         
            +
                    # def to_vhdl(type,level = 0)
         
     | 
| 
      
 1375 
     | 
    
         
            +
                    def to_vhdl(level = 0, type = self.type)
         
     | 
| 
       1351 
1376 
     | 
    
         
             
                        raise "Invalid class for a type: #{type.class}" unless type.is_a?(Type) 
         
     | 
| 
       1352 
1377 
     | 
    
         
             
                        # The resulting string.
         
     | 
| 
       1353 
1378 
     | 
    
         
             
                        res = ""
         
     | 
| 
         @@ -1487,6 +1512,18 @@ module HDLRuby::Low 
     | 
|
| 
       1487 
1512 
     | 
    
         
             
                    # Nothing to generate.
         
     | 
| 
       1488 
1513 
     | 
    
         
             
                end
         
     | 
| 
       1489 
1514 
     | 
    
         | 
| 
      
 1515 
     | 
    
         
            +
                ## Extends the StringE class with generation of HDLRuby::High text.
         
     | 
| 
      
 1516 
     | 
    
         
            +
                class StringE
         
     | 
| 
      
 1517 
     | 
    
         
            +
             
     | 
| 
      
 1518 
     | 
    
         
            +
                    # Generates the text of the equivalent HDLRuby::High code.
         
     | 
| 
      
 1519 
     | 
    
         
            +
                    # +level+ is the hierachical level of the object.
         
     | 
| 
      
 1520 
     | 
    
         
            +
                    def to_vhdl(level = 0, std_logic = false)
         
     | 
| 
      
 1521 
     | 
    
         
            +
                        # Generate a report statement.
         
     | 
| 
      
 1522 
     | 
    
         
            +
                        return "\"#{Low2VHDL.vhdl_string(self.content)}\"" +
         
     | 
| 
      
 1523 
     | 
    
         
            +
                            self.each_arg.map { |arg| arg.to_vhdl }.join(" & ")
         
     | 
| 
      
 1524 
     | 
    
         
            +
                    end
         
     | 
| 
      
 1525 
     | 
    
         
            +
                end
         
     | 
| 
      
 1526 
     | 
    
         
            +
             
     | 
| 
       1490 
1527 
     | 
    
         
             
                ## Extends the Numeric class with generation of HDLRuby::High text.
         
     | 
| 
       1491 
1528 
     | 
    
         
             
                class ::Numeric
         
     | 
| 
       1492 
1529 
     | 
    
         | 
| 
         @@ -61,6 +61,20 @@ module HDLRuby::Low 
     | 
|
| 
       61 
61 
     | 
    
         
             
                        return self
         
     | 
| 
       62 
62 
     | 
    
         
             
                    end
         
     | 
| 
       63 
63 
     | 
    
         
             
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                ## Extends the Print class with functionality for converting booleans
         
     | 
| 
      
 67 
     | 
    
         
            +
                #  in assignments to select operators.
         
     | 
| 
      
 68 
     | 
    
         
            +
                class Print
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                    # Converts booleans in assignments to select operators.
         
     | 
| 
      
 71 
     | 
    
         
            +
                    def boolean_in_assign2select!
         
     | 
| 
      
 72 
     | 
    
         
            +
                        # Apply on the arguments.
         
     | 
| 
      
 73 
     | 
    
         
            +
                        self.map_args! { |arg| arg.boolean_in_assign2select }
         
     | 
| 
      
 74 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 75 
     | 
    
         
            +
                    end
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
       64 
78 
     | 
    
         | 
| 
       65 
79 
     | 
    
         
             
                ## Extends the If class with functionality for converting booleans
         
     | 
| 
       66 
80 
     | 
    
         
             
                #  in assignments to select operators.
         
     | 
| 
         @@ -315,4 +329,19 @@ module HDLRuby::Low 
     | 
|
| 
       315 
329 
     | 
    
         
             
                        return self.clone
         
     | 
| 
       316 
330 
     | 
    
         
             
                    end
         
     | 
| 
       317 
331 
     | 
    
         
             
                end
         
     | 
| 
      
 332 
     | 
    
         
            +
             
     | 
| 
      
 333 
     | 
    
         
            +
             
     | 
| 
      
 334 
     | 
    
         
            +
                ## Extends the StringE class with functionality for converting booleans
         
     | 
| 
      
 335 
     | 
    
         
            +
                #  in assignments to select operators.
         
     | 
| 
      
 336 
     | 
    
         
            +
                class StringE
         
     | 
| 
      
 337 
     | 
    
         
            +
             
     | 
| 
      
 338 
     | 
    
         
            +
                    # Converts booleans in assignments to select operators.
         
     | 
| 
      
 339 
     | 
    
         
            +
                    def boolean_in_assign2select
         
     | 
| 
      
 340 
     | 
    
         
            +
                        # Apply on the content.
         
     | 
| 
      
 341 
     | 
    
         
            +
                        # Apply on the arguments.
         
     | 
| 
      
 342 
     | 
    
         
            +
                        return StringE.new(self.content.clone,*self.each_arg.map do |arg|
         
     | 
| 
      
 343 
     | 
    
         
            +
                            arg.boolean_in_assign2select
         
     | 
| 
      
 344 
     | 
    
         
            +
                        end)
         
     | 
| 
      
 345 
     | 
    
         
            +
                    end
         
     | 
| 
      
 346 
     | 
    
         
            +
                end
         
     | 
| 
       318 
347 
     | 
    
         
             
            end
         
     | 
| 
         @@ -62,6 +62,20 @@ module HDLRuby::Low 
     | 
|
| 
       62 
62 
     | 
    
         
             
                        return self
         
     | 
| 
       63 
63 
     | 
    
         
             
                    end
         
     | 
| 
       64 
64 
     | 
    
         
             
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                ## Extends the Print class with functionality for extracting 
         
     | 
| 
      
 68 
     | 
    
         
            +
                #  expressions from cast.
         
     | 
| 
      
 69 
     | 
    
         
            +
                class Print
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                    # Extracts the expressions from the casts.
         
     | 
| 
      
 72 
     | 
    
         
            +
                    def casts_without_expression!
         
     | 
| 
      
 73 
     | 
    
         
            +
                        # Apply on the arguments.
         
     | 
| 
      
 74 
     | 
    
         
            +
                        self.map_args!(&:casts_without_expression)
         
     | 
| 
      
 75 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 76 
     | 
    
         
            +
                    end
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
       65 
79 
     | 
    
         | 
| 
       66 
80 
     | 
    
         
             
                ## Extends the If class with functionality for extracting 
         
     | 
| 
       67 
81 
     | 
    
         
             
                #  expressions from cast.
         
     | 
| 
         @@ -323,4 +337,17 @@ module HDLRuby::Low 
     | 
|
| 
       323 
337 
     | 
    
         
             
                        return self.clone
         
     | 
| 
       324 
338 
     | 
    
         
             
                    end
         
     | 
| 
       325 
339 
     | 
    
         
             
                end
         
     | 
| 
      
 340 
     | 
    
         
            +
             
     | 
| 
      
 341 
     | 
    
         
            +
             
     | 
| 
      
 342 
     | 
    
         
            +
                ## Extends the StringE class with functionality for extracting 
         
     | 
| 
      
 343 
     | 
    
         
            +
                #  expressions from cast.
         
     | 
| 
      
 344 
     | 
    
         
            +
                class StringE
         
     | 
| 
      
 345 
     | 
    
         
            +
             
     | 
| 
      
 346 
     | 
    
         
            +
                    # Extracts the expressions from the casts.
         
     | 
| 
      
 347 
     | 
    
         
            +
                    def casts_without_expression
         
     | 
| 
      
 348 
     | 
    
         
            +
                        return StringE.new(self.content,
         
     | 
| 
      
 349 
     | 
    
         
            +
                                           *self.each_arg.map(&:cast_without_expression))
         
     | 
| 
      
 350 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 351 
     | 
    
         
            +
                    end
         
     | 
| 
      
 352 
     | 
    
         
            +
                end
         
     | 
| 
       326 
353 
     | 
    
         
             
            end
         
     | 
| 
         @@ -89,6 +89,20 @@ module HDLRuby::Low 
     | 
|
| 
       89 
89 
     | 
    
         | 
| 
       90 
90 
     | 
    
         
             
                end
         
     | 
| 
       91 
91 
     | 
    
         | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                ## Extends the Print class with fixing of types and constants.
         
     | 
| 
      
 94 
     | 
    
         
            +
                class Print
         
     | 
| 
      
 95 
     | 
    
         
            +
                    # Explicit the types conversions in the statement.
         
     | 
| 
      
 96 
     | 
    
         
            +
                    def explicit_types!
         
     | 
| 
      
 97 
     | 
    
         
            +
                        # Recurse on the arguments.
         
     | 
| 
      
 98 
     | 
    
         
            +
                        self.map_args!(&:explicit_types)
         
     | 
| 
      
 99 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 100 
     | 
    
         
            +
                    end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
       92 
106 
     | 
    
         | 
| 
       93 
107 
     | 
    
         
             
                ## Extends the If class with fixing of types and constants.
         
     | 
| 
       94 
108 
     | 
    
         
             
                class If
         
     | 
| 
         @@ -438,4 +452,15 @@ module HDLRuby::Low 
     | 
|
| 
       438 
452 
     | 
    
         
             
                end
         
     | 
| 
       439 
453 
     | 
    
         | 
| 
       440 
454 
     | 
    
         | 
| 
      
 455 
     | 
    
         
            +
                ## Extends the stringE class with fixing of types and constants.
         
     | 
| 
      
 456 
     | 
    
         
            +
                class StringE
         
     | 
| 
      
 457 
     | 
    
         
            +
                    # Explicit the types conversions in the concat where
         
     | 
| 
      
 458 
     | 
    
         
            +
                    # +type+ is the expected type of the condition if any.
         
     | 
| 
      
 459 
     | 
    
         
            +
                    def explicit_types(type = nil)
         
     | 
| 
      
 460 
     | 
    
         
            +
                        return StringE.new(self.content, 
         
     | 
| 
      
 461 
     | 
    
         
            +
                                           *self.each_arg.map(&:explicit_types))
         
     | 
| 
      
 462 
     | 
    
         
            +
                    end
         
     | 
| 
      
 463 
     | 
    
         
            +
                end
         
     | 
| 
      
 464 
     | 
    
         
            +
             
     | 
| 
      
 465 
     | 
    
         
            +
             
     | 
| 
       441 
466 
     | 
    
         
             
            end
         
     | 
| 
         @@ -626,6 +626,64 @@ module HDLRuby::Low 
     | 
|
| 
       626 
626 
     | 
    
         
             
                end
         
     | 
| 
       627 
627 
     | 
    
         | 
| 
       628 
628 
     | 
    
         | 
| 
      
 629 
     | 
    
         
            +
                ## 
         
     | 
| 
      
 630 
     | 
    
         
            +
                # Decribes a print statement.
         
     | 
| 
      
 631 
     | 
    
         
            +
                class Print
         
     | 
| 
      
 632 
     | 
    
         
            +
             
     | 
| 
      
 633 
     | 
    
         
            +
                    # Maps on the arguments.
         
     | 
| 
      
 634 
     | 
    
         
            +
                    def map_args!(&ruby_block)
         
     | 
| 
      
 635 
     | 
    
         
            +
                        @args.map! do |arg|
         
     | 
| 
      
 636 
     | 
    
         
            +
                            arg = ruby_block.call(arg)
         
     | 
| 
      
 637 
     | 
    
         
            +
                            arg.parent = self unless arg.parent
         
     | 
| 
      
 638 
     | 
    
         
            +
                            arg
         
     | 
| 
      
 639 
     | 
    
         
            +
                        end
         
     | 
| 
      
 640 
     | 
    
         
            +
                    end
         
     | 
| 
      
 641 
     | 
    
         
            +
             
     | 
| 
      
 642 
     | 
    
         
            +
                    alias_method :map_nodes!, :map_args!
         
     | 
| 
      
 643 
     | 
    
         
            +
             
     | 
| 
      
 644 
     | 
    
         
            +
                    # Delete an arg.
         
     | 
| 
      
 645 
     | 
    
         
            +
                    def delete_arg!(arg)
         
     | 
| 
      
 646 
     | 
    
         
            +
                        if @args.include?(arg) then
         
     | 
| 
      
 647 
     | 
    
         
            +
                            # The arg is present, delete it.
         
     | 
| 
      
 648 
     | 
    
         
            +
                            @args.delete(arg)
         
     | 
| 
      
 649 
     | 
    
         
            +
                            # And remove its parent.
         
     | 
| 
      
 650 
     | 
    
         
            +
                            arg.parent = nil
         
     | 
| 
      
 651 
     | 
    
         
            +
                        end
         
     | 
| 
      
 652 
     | 
    
         
            +
                        arg
         
     | 
| 
      
 653 
     | 
    
         
            +
                    end
         
     | 
| 
      
 654 
     | 
    
         
            +
             
     | 
| 
      
 655 
     | 
    
         
            +
                    # Replaces sub arguments using +node2rep+ table indicating the
         
     | 
| 
      
 656 
     | 
    
         
            +
                    # node to replace and the corresponding replacement.
         
     | 
| 
      
 657 
     | 
    
         
            +
                    # Returns the actually replaced nodes and their corresponding
         
     | 
| 
      
 658 
     | 
    
         
            +
                    # replacement.
         
     | 
| 
      
 659 
     | 
    
         
            +
                    #
         
     | 
| 
      
 660 
     | 
    
         
            +
                    # NOTE: the replacement is duplicated.
         
     | 
| 
      
 661 
     | 
    
         
            +
                    def replace_args!(node2rep)
         
     | 
| 
      
 662 
     | 
    
         
            +
                        # First recurse on the children.
         
     | 
| 
      
 663 
     | 
    
         
            +
                        res = {}
         
     | 
| 
      
 664 
     | 
    
         
            +
                        self.each_node do |node|
         
     | 
| 
      
 665 
     | 
    
         
            +
                            res.merge!(node.replace_args!(node2rep))
         
     | 
| 
      
 666 
     | 
    
         
            +
                        end
         
     | 
| 
      
 667 
     | 
    
         
            +
                        # Is there a replacement of on a sub node?
         
     | 
| 
      
 668 
     | 
    
         
            +
                        self.map_nodes! do |sub|
         
     | 
| 
      
 669 
     | 
    
         
            +
                            rep = node2rep[sub]
         
     | 
| 
      
 670 
     | 
    
         
            +
                            if rep then
         
     | 
| 
      
 671 
     | 
    
         
            +
                                # Yes, do it.
         
     | 
| 
      
 672 
     | 
    
         
            +
                                rep = rep.clone
         
     | 
| 
      
 673 
     | 
    
         
            +
                                node = sub
         
     | 
| 
      
 674 
     | 
    
         
            +
                                # node.set_parent!(nil)
         
     | 
| 
      
 675 
     | 
    
         
            +
                                # And register the replacement.
         
     | 
| 
      
 676 
     | 
    
         
            +
                                res[node] = rep
         
     | 
| 
      
 677 
     | 
    
         
            +
                                rep
         
     | 
| 
      
 678 
     | 
    
         
            +
                            else
         
     | 
| 
      
 679 
     | 
    
         
            +
                                sub
         
     | 
| 
      
 680 
     | 
    
         
            +
                            end
         
     | 
| 
      
 681 
     | 
    
         
            +
                        end
         
     | 
| 
      
 682 
     | 
    
         
            +
                        return res
         
     | 
| 
      
 683 
     | 
    
         
            +
                    end
         
     | 
| 
      
 684 
     | 
    
         
            +
                end
         
     | 
| 
      
 685 
     | 
    
         
            +
             
     | 
| 
      
 686 
     | 
    
         
            +
             
     | 
| 
       629 
687 
     | 
    
         
             
                ## 
         
     | 
| 
       630 
688 
     | 
    
         
             
                # Describes an if statement.
         
     | 
| 
       631 
689 
     | 
    
         
             
                class If
         
     | 
| 
         @@ -1093,6 +1151,18 @@ module HDLRuby::Low 
     | 
|
| 
       1093 
1151 
     | 
    
         
             
                        stmnt.parent = self
         
     | 
| 
       1094 
1152 
     | 
    
         
             
                    end
         
     | 
| 
       1095 
1153 
     | 
    
         | 
| 
      
 1154 
     | 
    
         
            +
                    # Replaces statement +org+ by statement +stmnt+.
         
     | 
| 
      
 1155 
     | 
    
         
            +
                    # 
         
     | 
| 
      
 1156 
     | 
    
         
            +
                    # NOTE: does nothing if +org+ is not present.
         
     | 
| 
      
 1157 
     | 
    
         
            +
                    def replace_statement!(org,stmnt)
         
     | 
| 
      
 1158 
     | 
    
         
            +
                        # Checks the statement.
         
     | 
| 
      
 1159 
     | 
    
         
            +
                        unless stmnt.is_a?(Statement)
         
     | 
| 
      
 1160 
     | 
    
         
            +
                            raise AnyError, "Invalid type for a statement: #{stmnt.class}"
         
     | 
| 
      
 1161 
     | 
    
         
            +
                        end
         
     | 
| 
      
 1162 
     | 
    
         
            +
                        idx = @statements.index(org)
         
     | 
| 
      
 1163 
     | 
    
         
            +
                        @statements[idx] = stmnt if idx
         
     | 
| 
      
 1164 
     | 
    
         
            +
                    end
         
     | 
| 
      
 1165 
     | 
    
         
            +
             
     | 
| 
       1096 
1166 
     | 
    
         
             
                    # Maps on the statements.
         
     | 
| 
       1097 
1167 
     | 
    
         
             
                    def map_statements!(&ruby_block)
         
     | 
| 
       1098 
1168 
     | 
    
         
             
                        @statements.map! do |stmnt|
         
     | 
| 
         @@ -84,6 +84,20 @@ module HDLRuby::Low 
     | 
|
| 
       84 
84 
     | 
    
         
             
                end
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
86 
     | 
    
         | 
| 
      
 87 
     | 
    
         
            +
                ##
         
     | 
| 
      
 88 
     | 
    
         
            +
                #  Extends RefIndex with the capability of finding the object it
         
     | 
| 
      
 89 
     | 
    
         
            +
                #  refered to.
         
     | 
| 
      
 90 
     | 
    
         
            +
                class Ref
         
     | 
| 
      
 91 
     | 
    
         
            +
                    ## Resolves the name of the reference (if any) and return the
         
     | 
| 
      
 92 
     | 
    
         
            +
                    #  corresponding object.
         
     | 
| 
      
 93 
     | 
    
         
            +
                    #  NOTE: return nil if could not resolve.
         
     | 
| 
      
 94 
     | 
    
         
            +
                    def resolve
         
     | 
| 
      
 95 
     | 
    
         
            +
                        # By default cannot resolve.
         
     | 
| 
      
 96 
     | 
    
         
            +
                        return nil
         
     | 
| 
      
 97 
     | 
    
         
            +
                    end
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
       87 
101 
     | 
    
         
             
                ##
         
     | 
| 
       88 
102 
     | 
    
         
             
                #  Extends RefIndex with the capability of finding the object it
         
     | 
| 
       89 
103 
     | 
    
         
             
                #  refered to.
         
     | 
| 
         @@ -93,6 +107,13 @@ module HDLRuby::Low 
     | 
|
| 
       93 
107 
     | 
    
         
             
                    def from_systemI?
         
     | 
| 
       94 
108 
     | 
    
         
             
                        return self.ref.from_systemI?
         
     | 
| 
       95 
109 
     | 
    
         
             
                    end
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                    ## Resolves the name of the reference (if any) and return the
         
     | 
| 
      
 112 
     | 
    
         
            +
                    #  corresponding object.
         
     | 
| 
      
 113 
     | 
    
         
            +
                    #  NOTE: return nil if could not resolve.
         
     | 
| 
      
 114 
     | 
    
         
            +
                    def resolve
         
     | 
| 
      
 115 
     | 
    
         
            +
                        return self.ref.resolve
         
     | 
| 
      
 116 
     | 
    
         
            +
                    end
         
     | 
| 
       96 
117 
     | 
    
         
             
                end
         
     | 
| 
       97 
118 
     | 
    
         | 
| 
       98 
119 
     | 
    
         | 
| 
         @@ -105,6 +126,13 @@ module HDLRuby::Low 
     | 
|
| 
       105 
126 
     | 
    
         
             
                    def from_systemI?
         
     | 
| 
       106 
127 
     | 
    
         
             
                        return self.ref.from_systemI?
         
     | 
| 
       107 
128 
     | 
    
         
             
                    end
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                    ## Resolves the name of the reference (if any) and return the
         
     | 
| 
      
 131 
     | 
    
         
            +
                    #  corresponding object.
         
     | 
| 
      
 132 
     | 
    
         
            +
                    #  NOTE: return nil if could not resolve.
         
     | 
| 
      
 133 
     | 
    
         
            +
                    def resolve
         
     | 
| 
      
 134 
     | 
    
         
            +
                        return self.ref.resolve
         
     | 
| 
      
 135 
     | 
    
         
            +
                    end
         
     | 
| 
       108 
136 
     | 
    
         
             
                end
         
     | 
| 
       109 
137 
     | 
    
         | 
| 
       110 
138 
     | 
    
         | 
| 
         @@ -42,7 +42,8 @@ module HDLRuby::Low 
     | 
|
| 
       42 
42 
     | 
    
         
             
                                    right_r = right.resolve if right.respond_to?(:resolve)
         
     | 
| 
       43 
43 
     | 
    
         
             
                                    # puts "right_r=#{right_r.name}" if right_r
         
     | 
| 
       44 
44 
     | 
    
         
             
                                    # puts "right_r.parent=#{right_r.parent.name}" if right_r && right_r.parent
         
     | 
| 
       45 
     | 
    
         
            -
                                    if right.is_a?(Value) then
         
     | 
| 
      
 45 
     | 
    
         
            +
                                    # if right.is_a?(Value) then
         
     | 
| 
      
 46 
     | 
    
         
            +
                                    if right.immutable? then
         
     | 
| 
       46 
47 
     | 
    
         
             
                                        # Right is value, the new transmit is to add
         
     | 
| 
       47 
48 
     | 
    
         
             
                                        # to the timed block.
         
     | 
| 
       48 
49 
     | 
    
         
             
                                        timed_blk.add_statement(
         
     | 
| 
         @@ -108,13 +109,15 @@ module HDLRuby::Low 
     | 
|
| 
       108 
109 
     | 
    
         
             
                                        # end
         
     | 
| 
       109 
110 
     | 
    
         
             
                                        # Both or neither input/output, make a behavior
         
     | 
| 
       110 
111 
     | 
    
         
             
                                        # for each.
         
     | 
| 
       111 
     | 
    
         
            -
                                        if (left.is_a?(Ref) 
     | 
| 
      
 112 
     | 
    
         
            +
                                        if (left.is_a?(Ref) && 
         
     | 
| 
      
 113 
     | 
    
         
            +
                                                !(left_r && left_r.immutable?)) then
         
     | 
| 
       112 
114 
     | 
    
         
             
                                            blk = Block.new(:par)
         
     | 
| 
       113 
115 
     | 
    
         
             
                                            blk.add_statement(
         
     | 
| 
       114 
116 
     | 
    
         
             
                                                Transmit.new(left.clone,right.clone))
         
     | 
| 
       115 
117 
     | 
    
         
             
                                            scope.add_behavior(Behavior.new(blk))
         
     | 
| 
       116 
118 
     | 
    
         
             
                                        end
         
     | 
| 
       117 
     | 
    
         
            -
                                        if (right.is_a?(Ref) 
     | 
| 
      
 119 
     | 
    
         
            +
                                        if (right.is_a?(Ref) &&
         
     | 
| 
      
 120 
     | 
    
         
            +
                                                !(right_r && right_r.immutable?)) then
         
     | 
| 
       118 
121 
     | 
    
         
             
                                            blk = Block.new(:par)
         
     | 
| 
       119 
122 
     | 
    
         
             
                                            blk.add_statement(
         
     | 
| 
       120 
123 
     | 
    
         
             
                                                Transmit.new(right.clone,left.clone))
         
     | 
| 
         @@ -617,10 +617,13 @@ module HDLRuby::Low 
     | 
|
| 
       617 
617 
     | 
    
         
             
                    # 
         
     | 
| 
       618 
618 
     | 
    
         
             
                    # NOTE: do not recurse into the sub scopes or behaviors!
         
     | 
| 
       619 
619 
     | 
    
         
             
                    def extract_declares!
         
     | 
| 
       620 
     | 
    
         
            -
                        # Recurse on the whens.
         
     | 
| 
       621 
     | 
    
         
            -
                        return self.each_when.map(&:extract_declares!)
         
     | 
| 
       622 
     | 
    
         
            -
                        # Recurse on the default if any.
         
     | 
| 
       623 
     | 
    
         
            -
                        self.default.extract_declares! if self.default
         
     | 
| 
      
 620 
     | 
    
         
            +
                        # # Recurse on the whens.
         
     | 
| 
      
 621 
     | 
    
         
            +
                        # return self.each_when.map(&:extract_declares!)
         
     | 
| 
      
 622 
     | 
    
         
            +
                        # # Recurse on the default if any.
         
     | 
| 
      
 623 
     | 
    
         
            +
                        # self.default.extract_declares! if self.default
         
     | 
| 
      
 624 
     | 
    
         
            +
                        res = self.each_when.map(&:extract_declares!)
         
     | 
| 
      
 625 
     | 
    
         
            +
                        res += self.default.extract_declares! if self.default
         
     | 
| 
      
 626 
     | 
    
         
            +
                        return res
         
     | 
| 
       624 
627 
     | 
    
         
             
                    end
         
     | 
| 
       625 
628 
     | 
    
         | 
| 
       626 
629 
     | 
    
         
             
                    # Replaces recursively +former+ name by +nname+ until it is redeclared.
         
     | 
| 
         @@ -0,0 +1,151 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'HDLRuby'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'HDLRuby/hruby_tools'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'HDLRuby/hruby_low_mutable'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module HDLRuby::Low
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ##
         
     | 
| 
      
 10 
     | 
    
         
            +
            # Converts par blocks within seq blocks to seq blocks.
         
     | 
| 
      
 11 
     | 
    
         
            +
            # For matching the executing model of Verilog.
         
     | 
| 
      
 12 
     | 
    
         
            +
            #
         
     | 
| 
      
 13 
     | 
    
         
            +
            ########################################################################
         
     | 
| 
      
 14 
     | 
    
         
            +
                
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                ## Extends the SystemT class with functionality for converting par blocks
         
     | 
| 
      
 17 
     | 
    
         
            +
                #  within seq blocks to seq blocks.
         
     | 
| 
      
 18 
     | 
    
         
            +
                class SystemT
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                    # Converts par blocks within seq blocks to seq blocks.
         
     | 
| 
      
 21 
     | 
    
         
            +
                    def par_in_seq2seq!
         
     | 
| 
      
 22 
     | 
    
         
            +
                        self.scope.par_in_seq2seq!
         
     | 
| 
      
 23 
     | 
    
         
            +
                    end
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                ## Extends the Scope class with functionality for breaking assingments
         
     | 
| 
      
 27 
     | 
    
         
            +
                #  to concats.
         
     | 
| 
      
 28 
     | 
    
         
            +
                class Scope
         
     | 
| 
      
 29 
     | 
    
         
            +
                    # Converts par blocks within seq blocks to seq blocks.
         
     | 
| 
      
 30 
     | 
    
         
            +
                    def par_in_seq2seq!
         
     | 
| 
      
 31 
     | 
    
         
            +
                        # Recruse on the sub scopes.
         
     | 
| 
      
 32 
     | 
    
         
            +
                        self.each_scope(&:par_in_seq2seq!)
         
     | 
| 
      
 33 
     | 
    
         
            +
                        # Recurse on the block.
         
     | 
| 
      
 34 
     | 
    
         
            +
                        self.each_behavior do |behavior|
         
     | 
| 
      
 35 
     | 
    
         
            +
                            behavior.block.par_in_seq2seq!
         
     | 
| 
      
 36 
     | 
    
         
            +
                        end
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                ## Extends the Statement class with functionality for breaking assingments
         
     | 
| 
      
 42 
     | 
    
         
            +
                #  to concats.
         
     | 
| 
      
 43 
     | 
    
         
            +
                class Statement
         
     | 
| 
      
 44 
     | 
    
         
            +
                    # Converts par blocks within seq blocks to seq blocks.
         
     | 
| 
      
 45 
     | 
    
         
            +
                    def par_in_seq2seq!
         
     | 
| 
      
 46 
     | 
    
         
            +
                        # By default nothing to do.
         
     | 
| 
      
 47 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 48 
     | 
    
         
            +
                    end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                    # Convert the block to seq.
         
     | 
| 
      
 51 
     | 
    
         
            +
                    def to_seq!
         
     | 
| 
      
 52 
     | 
    
         
            +
                        # By default nothing to do.
         
     | 
| 
      
 53 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                ## Extends the If class with functionality for breaking assingments
         
     | 
| 
      
 59 
     | 
    
         
            +
                #  to concats.
         
     | 
| 
      
 60 
     | 
    
         
            +
                class If
         
     | 
| 
      
 61 
     | 
    
         
            +
                    # Converts par blocks within seq blocks to seq blocks.
         
     | 
| 
      
 62 
     | 
    
         
            +
                    def par_in_seq2seq!
         
     | 
| 
      
 63 
     | 
    
         
            +
                        self.yes.par_in_seq2seq!
         
     | 
| 
      
 64 
     | 
    
         
            +
                        self.each_noif do |cond,blk|
         
     | 
| 
      
 65 
     | 
    
         
            +
                            blk.par_in_seq2seq!
         
     | 
| 
      
 66 
     | 
    
         
            +
                        end
         
     | 
| 
      
 67 
     | 
    
         
            +
                        self.no.par_in_seq2seq! if self.no
         
     | 
| 
      
 68 
     | 
    
         
            +
                    end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                    # Convert the block to seq.
         
     | 
| 
      
 71 
     | 
    
         
            +
                    def to_seq!
         
     | 
| 
      
 72 
     | 
    
         
            +
                        self.to_seq!
         
     | 
| 
      
 73 
     | 
    
         
            +
                        self.each_noif do |cond,blk|
         
     | 
| 
      
 74 
     | 
    
         
            +
                            blk.to_seq!
         
     | 
| 
      
 75 
     | 
    
         
            +
                        end
         
     | 
| 
      
 76 
     | 
    
         
            +
                        self.no.to_seq! if self.no
         
     | 
| 
      
 77 
     | 
    
         
            +
                    end
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                ## Extends the Case class with functionality for breaking assingments
         
     | 
| 
      
 82 
     | 
    
         
            +
                #  to concats.
         
     | 
| 
      
 83 
     | 
    
         
            +
                class Case
         
     | 
| 
      
 84 
     | 
    
         
            +
                    # Converts par blocks within seq blocks to seq blocks.
         
     | 
| 
      
 85 
     | 
    
         
            +
                    def par_in_seq2seq!
         
     | 
| 
      
 86 
     | 
    
         
            +
                        self.each_when do |w|
         
     | 
| 
      
 87 
     | 
    
         
            +
                            w.statement.par_in_seq2seq!
         
     | 
| 
      
 88 
     | 
    
         
            +
                        end
         
     | 
| 
      
 89 
     | 
    
         
            +
                        self.default.par_in_seq2seq! if self.default
         
     | 
| 
      
 90 
     | 
    
         
            +
                    end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                    # Convert the block to seq.
         
     | 
| 
      
 93 
     | 
    
         
            +
                    def to_seq!
         
     | 
| 
      
 94 
     | 
    
         
            +
                        self.each_when do |w|
         
     | 
| 
      
 95 
     | 
    
         
            +
                            w.statement.to_seq!
         
     | 
| 
      
 96 
     | 
    
         
            +
                        end
         
     | 
| 
      
 97 
     | 
    
         
            +
                        self.default.to_seq! if self.default
         
     | 
| 
      
 98 
     | 
    
         
            +
                    end
         
     | 
| 
      
 99 
     | 
    
         
            +
                end
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                ## Extends the Block class with functionality for breaking assingments
         
     | 
| 
      
 103 
     | 
    
         
            +
                #  to concats.
         
     | 
| 
      
 104 
     | 
    
         
            +
                class Block
         
     | 
| 
      
 105 
     | 
    
         
            +
                    # Converts par blocks within seq blocks to seq blocks.
         
     | 
| 
      
 106 
     | 
    
         
            +
                    def par_in_seq2seq!
         
     | 
| 
      
 107 
     | 
    
         
            +
                        # Recurse on the sub blocks.
         
     | 
| 
      
 108 
     | 
    
         
            +
                        self.each_statement(&:par_in_seq2seq!)
         
     | 
| 
      
 109 
     | 
    
         
            +
                        # Is the current block a seq block?
         
     | 
| 
      
 110 
     | 
    
         
            +
                        if self.mode == :seq then
         
     | 
| 
      
 111 
     | 
    
         
            +
                            # Yes, convert its inner par blocks to seq blocks.
         
     | 
| 
      
 112 
     | 
    
         
            +
                            self.each_statement do |statement|
         
     | 
| 
      
 113 
     | 
    
         
            +
                                if (statement.is_a?(Block)) then
         
     | 
| 
      
 114 
     | 
    
         
            +
                                    statement.to_seq! if statement.mode == :par
         
     | 
| 
      
 115 
     | 
    
         
            +
                                end
         
     | 
| 
      
 116 
     | 
    
         
            +
                            end
         
     | 
| 
      
 117 
     | 
    
         
            +
                        end
         
     | 
| 
      
 118 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 119 
     | 
    
         
            +
                    end
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
                    # Convert the block to seq.
         
     | 
| 
      
 122 
     | 
    
         
            +
                    def to_seq!
         
     | 
| 
      
 123 
     | 
    
         
            +
                        if self.mode == :par then
         
     | 
| 
      
 124 
     | 
    
         
            +
                            # Need to convert.
         
     | 
| 
      
 125 
     | 
    
         
            +
                            # First recurse on the sub blocks.
         
     | 
| 
      
 126 
     | 
    
         
            +
                            self.each_statement(&:to_seq!)
         
     | 
| 
      
 127 
     | 
    
         
            +
                            # Now replace each left value by a new signal for
         
     | 
| 
      
 128 
     | 
    
         
            +
                            # differed assingment in seq.
         
     | 
| 
      
 129 
     | 
    
         
            +
                            differeds = []
         
     | 
| 
      
 130 
     | 
    
         
            +
                            self.each_statement do |statement|
         
     | 
| 
      
 131 
     | 
    
         
            +
                                left = statement.left
         
     | 
| 
      
 132 
     | 
    
         
            +
                                if statement.is_a?(Transmit) then
         
     | 
| 
      
 133 
     | 
    
         
            +
                                    sig = SignalI.new(HDLRuby.uniq_name,left.type)
         
     | 
| 
      
 134 
     | 
    
         
            +
                                    self.add_inner(sig)
         
     | 
| 
      
 135 
     | 
    
         
            +
                                    diff = RefName.new(left.type,RefThis.new,sig.name)
         
     | 
| 
      
 136 
     | 
    
         
            +
                                    differeds << [left,diff]
         
     | 
| 
      
 137 
     | 
    
         
            +
                                    statement.set_left!(diff)
         
     | 
| 
      
 138 
     | 
    
         
            +
                                end
         
     | 
| 
      
 139 
     | 
    
         
            +
                            end
         
     | 
| 
      
 140 
     | 
    
         
            +
                            # Adds the differed assignments.
         
     | 
| 
      
 141 
     | 
    
         
            +
                            differeds.each do |left,diff|
         
     | 
| 
      
 142 
     | 
    
         
            +
                                self.add_statement(Transmit.new(left.clone,diff.clone))
         
     | 
| 
      
 143 
     | 
    
         
            +
                            end
         
     | 
| 
      
 144 
     | 
    
         
            +
                            # Change the mode.
         
     | 
| 
      
 145 
     | 
    
         
            +
                            self.set_mode!(:seq)
         
     | 
| 
      
 146 
     | 
    
         
            +
                        end
         
     | 
| 
      
 147 
     | 
    
         
            +
                        return self
         
     | 
| 
      
 148 
     | 
    
         
            +
                    end
         
     | 
| 
      
 149 
     | 
    
         
            +
                end
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
            end
         
     |