HDLRuby 2.11.3 → 2.11.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71e8ee2662101e18157249150f4766654b0c049e08c87190fa6e06e2805d087b
4
- data.tar.gz: cfc13c02e2fae3ad7d2a3831be9728cc35dffa3096016c2790d9649d19348f18
3
+ metadata.gz: 5b3303f28a79a14a42fb2421335afdbaa40c148440e622edaca2f8a98804192d
4
+ data.tar.gz: 12dd7c5fd160141c151db950b7d797ef53bf012549ef983f8cf1b648edb3a85e
5
5
  SHA512:
6
- metadata.gz: cae45da4c41f556fc550a53272861e3def26bc15107a7bcb2cce1b3f8e99491d4b9cb8d2d4f4f621f422ef99c64ed704ac2e05a5f7c2b6d906133f420994aaf1
7
- data.tar.gz: d29fb9b5ba800bcc4dff27c78e8a5762b9e7be1550ec1cb916a3cda543fabce878cc317c11e208e7a299896a7fc308cb307db0667dc6b3f416920b3d1c5fa2b0
6
+ metadata.gz: 94ba5098e5e8003f64c53f86ba47f8e831e3e49d39aa4f8991f3595dfec560749079720a6602bf76f2e31eacf88c922a0c689bf575e2ec17a48256dba70010d0
7
+ data.tar.gz: 1856330cc10987e979ed13211d3a6aaaa1f382bfe9a6831a4a235eac35ea912844c5ca9b667f2a899b87a47518c29e38cb8c9b7c6a5ee27e953872fb810b8f30
data/README.md CHANGED
@@ -1949,15 +1949,19 @@ There are two kinds of such statements:
1949
1949
  !10.ns
1950
1950
  ```
1951
1951
 
1952
- - The `repeat` statements: such a statement takes as argument a time value and a block. The execution of the block is repeated until the delay that is given by the time value argument expires. For example, the following code executes repeatedly the inversion of the `clk` signal every 10 nanoseconds for 10 seconds (i.e., it simulates a clock signal for 10 seconds):
1952
+ - The `repeat` statements: such a statement takes as argument a number of iteration and a block. The execution of the block is repeated the given number times. For example, the following code executes 10 times the inversion of the `clk` signal every 10 nanoseconds:
1953
1953
 
1954
1954
  ```ruby
1955
- repeat(10.s) do
1955
+ repeat(10) do
1956
1956
  !10.ns
1957
1957
  clk <= ~clk
1958
1958
  end
1959
1959
  ```
1960
1960
 
1961
+ __Note:__
1962
+
1963
+ This statement is not synthesizable and therefore can only be used in timed behaviors.
1964
+
1961
1965
  ### Parallel and sequential execution
1962
1966
 
1963
1967
  Time behaviors are by default sequential, but they can include both parallel and
@@ -430,6 +430,27 @@ VALUE rcsim_make_timeWait(VALUE mod, VALUE unitV, VALUE delayV) {
430
430
  return res;
431
431
  }
432
432
 
433
+ /* Creating a time repeat C object. */
434
+ VALUE rcsim_make_timeRepeat(VALUE mod, VALUE numberV, VALUE statementV) {
435
+ // printf("rcsim_make_timeRepeat\n"); fflush(stdout);
436
+ /* Allocates the time repeat. */
437
+ TimeRepeat timeRepeat = (TimeRepeat)malloc(sizeof(TimeRepeatS));
438
+ // printf("timeRepeat=%p\n",timeRepeat); fflush(stdout);
439
+ /* Set it up. */
440
+ timeRepeat->kind = TIME_REPEAT;
441
+ /* Get and set the number of repeatition. */
442
+ long long number;
443
+ number = NUM2LL(numberV);
444
+ // printf("number=%lld\n",number); fflush(stdout);
445
+ timeRepeat->number = number;
446
+ /* Get and set the statement. */
447
+ value_to_rcsim(StatementS,statementV,timeRepeat->statement);
448
+ /* Returns the C time wait embedded into a ruby VALUE. */
449
+ VALUE res;
450
+ rcsim_to_value(TimeRepeatS,timeRepeat,res);
451
+ return res;
452
+ }
453
+
433
454
 
434
455
  /* Creating a time terminate C object. */
435
456
  VALUE rcsim_make_timeTerminate(VALUE mod) {
@@ -447,19 +468,19 @@ VALUE rcsim_make_timeTerminate(VALUE mod) {
447
468
 
448
469
 
449
470
  /* Creating a hardware if C object. */
450
- VALUE rcsim_make_hif(VALUE mod, VALUE condition, VALUE yes, VALUE no) {
471
+ VALUE rcsim_make_hif(VALUE mod, VALUE conditionV, VALUE yesV, VALUE noV) {
451
472
  // printf("rcsim_make_hif\n");
452
473
  /* Allocates the hardware if. */
453
474
  HIf hif = (HIf)malloc(sizeof(HIfS));
454
475
  // printf("hif=%p\n",hif);
455
476
  /* Set it up. */
456
477
  hif->kind = HIF;
457
- value_to_rcsim(ExpressionS,condition,hif->condition);
458
- value_to_rcsim(StatementS,yes,hif->yes);
459
- if (TYPE(no) == T_NIL)
478
+ value_to_rcsim(ExpressionS,conditionV,hif->condition);
479
+ value_to_rcsim(StatementS,yesV,hif->yes);
480
+ if (TYPE(noV) == T_NIL)
460
481
  hif->no = NULL;
461
482
  else
462
- value_to_rcsim(StatementS,no,hif->no);
483
+ value_to_rcsim(StatementS,noV,hif->no);
463
484
  hif->num_noifs = 0;
464
485
  hif->noconds = NULL;
465
486
  hif->nostmnts = NULL;
@@ -471,21 +492,21 @@ VALUE rcsim_make_hif(VALUE mod, VALUE condition, VALUE yes, VALUE no) {
471
492
 
472
493
 
473
494
  /* Creating a hardware case C object. */
474
- VALUE rcsim_make_hcase(VALUE mod, VALUE value, VALUE defolt) {
495
+ VALUE rcsim_make_hcase(VALUE mod, VALUE valueV, VALUE defoltV) {
475
496
  // printf("rcsim_make_hcase\n");
476
497
  /* Allocates the hardware case. */
477
498
  HCase hcase = (HCase)malloc(sizeof(HCaseS));
478
499
  // printf("hcase=%p\n",hcase);
479
500
  /* Set it up. */
480
501
  hcase->kind = HCASE;
481
- value_to_rcsim(ExpressionS,value,hcase->value);
502
+ value_to_rcsim(ExpressionS,valueV,hcase->value);
482
503
  hcase->num_whens = 0;
483
504
  hcase->matches = NULL;
484
505
  hcase->stmnts = NULL;
485
- if (TYPE(defolt) == T_NIL)
506
+ if (TYPE(defoltV) == T_NIL)
486
507
  hcase->defolt = NULL;
487
508
  else
488
- value_to_rcsim(StatementS,defolt,hcase->defolt);
509
+ value_to_rcsim(StatementS,defoltV,hcase->defolt);
489
510
  /* Returns the C hardware case embedded into a ruby VALUE. */
490
511
  VALUE res;
491
512
  rcsim_to_value(HCaseS,hcase,res);
@@ -494,7 +515,7 @@ VALUE rcsim_make_hcase(VALUE mod, VALUE value, VALUE defolt) {
494
515
 
495
516
 
496
517
  /* Creating a block C object. */
497
- VALUE rcsim_make_block(VALUE mod, VALUE mode) {
518
+ VALUE rcsim_make_block(VALUE mod, VALUE modeV) {
498
519
  // printf("rcsim_make_block\n");
499
520
  /* Allocates the block. */
500
521
  Block block = (Block)malloc(sizeof(BlockS));
@@ -507,7 +528,7 @@ VALUE rcsim_make_block(VALUE mod, VALUE mode) {
507
528
  block->inners = NULL;
508
529
  block->num_stmnts = 0;
509
530
  block->stmnts = NULL;
510
- block->mode = SYM2ID(mode) == id_PAR ? PAR : SEQ;
531
+ block->mode = SYM2ID(modeV) == id_PAR ? PAR : SEQ;
511
532
  /* Returns the C block embedded into a ruby VALUE. */
512
533
  VALUE res;
513
534
  rcsim_to_value(BlockS,block,res);
@@ -1373,6 +1394,7 @@ void Init_hruby_sim() {
1373
1394
  rb_define_singleton_method(mod,"rcsim_make_transmit",rcsim_make_transmit,2);
1374
1395
  rb_define_singleton_method(mod,"rcsim_make_print",rcsim_make_print,0);
1375
1396
  rb_define_singleton_method(mod,"rcsim_make_timeWait",rcsim_make_timeWait,2);
1397
+ rb_define_singleton_method(mod,"rcsim_make_timeRepeat",rcsim_make_timeRepeat,2);
1376
1398
  rb_define_singleton_method(mod,"rcsim_make_timeTerminate",rcsim_make_timeTerminate,0);
1377
1399
  rb_define_singleton_method(mod,"rcsim_make_hif",rcsim_make_hif,3);
1378
1400
  rb_define_singleton_method(mod,"rcsim_make_hcase",rcsim_make_hcase,2);
@@ -28,6 +28,7 @@ typedef struct PrintS_ PrintS;
28
28
  typedef struct HIfS_ HIfS;
29
29
  typedef struct HCaseS_ HCaseS;
30
30
  typedef struct TimeWaitS_ TimeWaitS;
31
+ typedef struct TimeRepeatS_ TimeRepeatS;
31
32
  typedef struct TimeTerminateS_ TimeTerminateS;
32
33
  typedef struct ExpressionS_ ExpressionS;
33
34
  typedef struct UnaryS_ UnaryS;
@@ -63,6 +64,7 @@ typedef struct PrintS_* Print;
63
64
  typedef struct HIfS_* HIf;
64
65
  typedef struct HCaseS_* HCase;
65
66
  typedef struct TimeWaitS_* TimeWait;
67
+ typedef struct TimeRepeatS_* TimeRepeat;
66
68
  typedef struct TimeTerminateS_* TimeTerminate;
67
69
  typedef struct ExpressionS_* Expression;
68
70
  typedef struct UnaryS_* Unary;
@@ -89,7 +91,8 @@ typedef enum {
89
91
  #endif
90
92
  OBJECT, SYSTEMT, SIGNALI, SCOPE, BEHAVIOR, SYSTEMI, CODE, BLOCK, EVENT,
91
93
  #ifdef RCSIM
92
- /* Statements */ TRANSMIT, PRINT, HIF, HCASE, TIME_WAIT, TIME_TERMINATE,
94
+ /* Statements */ TRANSMIT, PRINT, HIF, HCASE,
95
+ TIME_WAIT, TIME_REPEAT, TIME_TERMINATE,
93
96
  /* Expressions */ UNARY, BINARY, SELECT, CONCAT, CAST,
94
97
  /* References */ REF_OBJECT, REF_INDEX, REF_RANGE, REF_CONCAT,
95
98
  /* Non-hardware*/ STRINGE,
@@ -670,6 +673,13 @@ typedef struct TimeWaitS_ {
670
673
  unsigned long long delay; /* The delay to wait in pico seconds. */
671
674
  } TimeWaitS;
672
675
 
676
+ /** The C model of a time repeat statement. */
677
+ typedef struct TimeRepeatS_ {
678
+ Kind kind; /* The kind of object. */
679
+ long long number; /* The number of interations, negative means infinity. */
680
+ Statement statement;/* The statement to execute in loop. */
681
+ } TimeRepeatS;
682
+
673
683
  /** The C model of a time terminate statement. */
674
684
  typedef struct TimeTerminateS_ {
675
685
  Kind kind; /* The kind of object. */
@@ -358,6 +358,20 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
358
358
  hw_wait(delay,behavior);
359
359
  break;
360
360
  }
361
+ case TIME_REPEAT:
362
+ {
363
+ TimeRepeat rep = (TimeRepeat)stmnt;
364
+ if (rep->number>=0) {
365
+ for(long long i=0; i<rep->number; ++i) {
366
+ execute_statement(rep->statement,mode,behavior);
367
+ }
368
+ } else {
369
+ for(;;) {
370
+ execute_statement(rep->statement,mode,behavior);
371
+ }
372
+ }
373
+ break;
374
+ }
361
375
  case BLOCK:
362
376
  {
363
377
  Block block = (Block)stmnt;
@@ -0,0 +1,48 @@
1
+ # A simple D-FF
2
+ system :dff do
3
+ input :d, :clk, :rst
4
+ output :q
5
+
6
+ (q <= d & ~rst).at(clk.posedge)
7
+ end
8
+
9
+ # A benchmark for the dff using repeat.
10
+ system :dff_bench do
11
+ inner :d, :clk, :rst
12
+ inner :q
13
+
14
+ dff(:my_dff).(d,clk,rst,q)
15
+
16
+ timed do
17
+ clk <= 0
18
+ rst <= 0
19
+ d <= _z
20
+ !10.ns
21
+ clk <= 1
22
+ rst <= 0
23
+ d <= _z
24
+ !10.ns
25
+ clk <= 0
26
+ rst <= 1
27
+ d <= _z
28
+ !10.ns
29
+ clk <= 1
30
+ rst <= 1
31
+ d <= _z
32
+ !10.ns
33
+ clk <= 0
34
+ rst <= 0
35
+ d <= 1
36
+ !10.ns
37
+ clk <= 1
38
+ rst <= 0
39
+ !10.ns
40
+ repeat(100) do
41
+ clk <= 0
42
+ d <= ~d
43
+ !10.ns
44
+ clk <= 1
45
+ !10.ns
46
+ end
47
+ end
48
+ end
@@ -2682,10 +2682,10 @@ module HDLRuby::High
2682
2682
 
2683
2683
  # Converts the repeat statement to HDLRuby::Low.
2684
2684
  def to_low
2685
- # return HDLRuby::Low::TimeRepeat.new(self.statement.to_low,
2685
+ # timeRepeatL = HDLRuby::Low::TimeRepeat.new(self.statement.to_low,
2686
2686
  # self.delay.to_low)
2687
- timeRepeatL = HDLRuby::Low::TimeRepeat.new(self.statement.to_low,
2688
- self.delay.to_low)
2687
+ timeRepeatL = HDLRuby::Low::TimeRepeat.new(self.number,
2688
+ self.statement.to_low)
2689
2689
  # # For debugging: set the source high object
2690
2690
  # timeRepeatL.properties[:low2high] = self.hdr_id
2691
2691
  # self.properties[:high2low] = timeRepeatL
@@ -4233,15 +4233,20 @@ module HDLRuby::High
4233
4233
  self.add_statement(TimeWait.new(delay))
4234
4234
  end
4235
4235
 
4236
- # Adds a loop until +delay+ statement in the block in +mode+ whose
4236
+ # # Adds a loop until +delay+ statement in the block in +mode+ whose
4237
+ # # loop content is built using +ruby_block+.
4238
+ # def repeat(delay, mode = nil, &ruby_block)
4239
+ # Adds a +number+ times loop statement in the block in +mode+ whose
4237
4240
  # loop content is built using +ruby_block+.
4238
- def repeat(delay, mode = nil, &ruby_block)
4241
+ # NOTE: if +number+ is negative, the number of iteration is infinite.
4242
+ def repeat(number = -1, mode = nil, &ruby_block)
4239
4243
  # Ensure there is a block.
4240
4244
  ruby_block = proc {} unless block_given?
4241
4245
  # Build the content block.
4242
4246
  content = High.make_block(mode,&ruby_block)
4243
4247
  # Create and add the statement.
4244
- self.add_statement(TimeRepeat.new(content,delay))
4248
+ # self.add_statement(TimeRepeat.new(content,delay))
4249
+ self.add_statement(TimeRepeat.new(number,content))
4245
4250
  end
4246
4251
 
4247
4252
  # Converts the time block to HDLRuby::Low.
@@ -4042,15 +4042,20 @@ module HDLRuby::Low
4042
4042
  ##
4043
4043
  # Describes a timed loop statement: not synthesizable!
4044
4044
  class TimeRepeat < Statement
4045
- # The delay until the loop is repeated
4046
- attr_reader :delay
4045
+ # # The delay until the loop is repeated
4046
+ # attr_reader :delay
4047
+ # The number of interrations.
4048
+ attr_reader :number
4047
4049
 
4048
4050
  # The statement to execute.
4049
4051
  attr_reader :statement
4050
4052
 
4051
- # Creates a new timed loop statement execute in a loop +statement+ until
4052
- # +delay+ has passed.
4053
- def initialize(statement,delay)
4053
+ # # Creates a new timed loop statement execute in a loop +statement+ until
4054
+ # # +delay+ has passed.
4055
+ # def initialize(statement,delay)
4056
+ # Creates a new timed loop statement execute in a loop +statement+
4057
+ # +number+ times (negative means inifinity).
4058
+ def initialize(number,statement)
4054
4059
  # Check and set the statement.
4055
4060
  unless statement.is_a?(Statement)
4056
4061
  raise AnyError,
@@ -4061,13 +4066,15 @@ module HDLRuby::Low
4061
4066
  # And set its parent.
4062
4067
  statement.parent = self
4063
4068
 
4064
- # Check and set the delay.
4065
- unless delay.is_a?(Delay)
4066
- raise AnyError, "Invalid class for a delay: #{delay.class}."
4067
- end
4068
- @delay = delay
4069
- # And set its parent.
4070
- delay.parent = self
4069
+ # # Check and set the delay.
4070
+ # unless delay.is_a?(Delay)
4071
+ # raise AnyError, "Invalid class for a delay: #{delay.class}."
4072
+ # end
4073
+ # @delay = delay
4074
+ # Check and set the number.
4075
+ @number = number.to_i
4076
+ # # And set its parent.
4077
+ # delay.parent = self
4071
4078
  end
4072
4079
 
4073
4080
  # Iterates over each object deeply.
@@ -4080,26 +4087,29 @@ module HDLRuby::Low
4080
4087
  ruby_block.call(self)
4081
4088
  # Then apply on the statement.
4082
4089
  self.statement.each_deep(&ruby_block)
4083
- # Then apply on the delay.
4084
- self.delay.each_deep(&ruby_block)
4090
+ # # Then apply on the delay.
4091
+ # self.delay.each_deep(&ruby_block)
4085
4092
  end
4086
4093
 
4087
4094
  # Comparison for hash: structural comparison.
4088
4095
  def eql?(obj)
4089
4096
  return false unless obj.is_a?(TimeRepeat)
4090
- return false unless @delay.eql?(obj.delay)
4097
+ # return false unless @delay.eql?(obj.delay)
4098
+ return false unless @number.eql?(obj.number)
4091
4099
  return false unless @statement.eql?(obj.statement)
4092
4100
  return true
4093
4101
  end
4094
4102
 
4095
4103
  # Hash function.
4096
4104
  def hash
4097
- return [@delay,@statement].hash
4105
+ # return [@delay,@statement].hash
4106
+ return [@number,@statement].hash
4098
4107
  end
4099
4108
 
4100
4109
  # Clones the TimeRepeat (deeply)
4101
4110
  def clone
4102
- return TimeRepeat.new(@statement.clone,@delay.clone)
4111
+ # return TimeRepeat.new(@statement.clone,@delay.clone)
4112
+ return TimeRepeat.new(@statement.clone,@number)
4103
4113
  end
4104
4114
 
4105
4115
  # Iterates over the expression children if any.
@@ -1803,20 +1803,39 @@ module HDLRuby::Low
1803
1803
  ## Extends the TimeRepeat class with generation of C text.
1804
1804
  class TimeRepeat
1805
1805
 
1806
+ # # Generates the C text of the equivalent HDLRuby code.
1807
+ # # +level+ is the hierachical level of the object.
1808
+ # # def to_c(level = 0)
1809
+ # def to_c(res,level = 0)
1810
+ # # The resulting string.
1811
+ # # res = " " * level*3
1812
+ # res << " " * level*3
1813
+ # # Generate an infinite loop executing the block and waiting.
1814
+ # res << "for(;;) {\n"
1815
+ # # res << "#{self.statement.to_c(level+1)}\n"
1816
+ # self.statement.to_c(res,level+1)
1817
+ # res << "\n"
1818
+ # res << " " * (level+1)*3
1819
+ # res << Low2C.wait_code(self,level)
1820
+ # # Return the resulting string.
1821
+ # return res
1822
+ # end
1823
+
1806
1824
  # Generates the C text of the equivalent HDLRuby code.
1807
1825
  # +level+ is the hierachical level of the object.
1808
1826
  # def to_c(level = 0)
1809
1827
  def to_c(res,level = 0)
1810
1828
  # The resulting string.
1811
- # res = " " * level*3
1812
1829
  res << " " * level*3
1813
- # Generate an infinite loop executing the block and waiting.
1814
- res << "for(;;) {\n"
1815
- # res << "#{self.statement.to_c(level+1)}\n"
1830
+ if (number < 0) then
1831
+ # Generate an infinite loop executing the block and waiting.
1832
+ res << "for(;;) {\n"
1833
+ else
1834
+ # Generate a finite loop.
1835
+ res << "for(long long i = 0; i<#{self.number}; ++i) {\n"
1836
+ end
1816
1837
  self.statement.to_c(res,level+1)
1817
- res << "\n"
1818
- res << " " * (level+1)*3
1819
- res << Low2C.wait_code(self,level)
1838
+ res << " " * level*3 << "}\n"
1820
1839
  # Return the resulting string.
1821
1840
  return res
1822
1841
  end
@@ -654,7 +654,21 @@ module HDLRuby::High
654
654
  ## Extends the TimeRepeat class for hybrid Ruby-C simulation.
655
655
  class TimeRepeat
656
656
  attr_reader :rcstatement
657
- # TODO!!!
657
+
658
+ # Generate the C description of the hardware case.
659
+ # +owner+ is a link to the C description of the owner behavior if any.
660
+ def to_rcsim(owner = nil)
661
+ # Create the timeRepeat C object.
662
+ @rcstatement = RCSim.rcsim_make_timeRepeat(self.number,
663
+ self.statement.to_rcsim)
664
+
665
+ # Sets the owner if any.
666
+ if owner then
667
+ RCSim.rcsim_set_owner(@rcstatement,owner)
668
+ end
669
+
670
+ return @rcstatement
671
+ end
658
672
  end
659
673
 
660
674
 
@@ -670,7 +684,7 @@ module HDLRuby::High
670
684
 
671
685
  # Sets the owner if any.
672
686
  if owner then
673
- RCSim.rcsim_set_block_owner(@rcstatement,owner)
687
+ RCSim.rcsim_set_owner(@rcstatement,owner)
674
688
  end
675
689
 
676
690
  # Add the inner signals.
@@ -701,7 +701,16 @@ module HDLRuby::High
701
701
  ##
702
702
  # Describes a timed loop statement: not synthesizable!
703
703
  class TimeRepeat
704
- ## Deprecated
704
+ ## Initialize the simulation for system +systemT+.
705
+ def init_sim(systemT)
706
+ # Recurde on the statement.
707
+ self.statement.init_sim(systemT)
708
+ end
709
+
710
+ ## Executes the statement.
711
+ def execute(mode)
712
+ self.number.times { self.statement.execute(mode) }
713
+ end
705
714
  end
706
715
 
707
716
 
@@ -179,6 +179,21 @@ module HDLRuby::High
179
179
  end
180
180
  end
181
181
 
182
+ ##
183
+ # Enhance the TimeRepeat class with VCD support.
184
+ class TimeRepeat
185
+ ## Shows the hierarchy of the variables.
186
+ def show_hierarchy(vcdout)
187
+ # Recurse on the statement.
188
+ self.statement.show_hierarchy(vcdout)
189
+ end
190
+
191
+ ## Gets the VCD variables with their long name.
192
+ def get_vars_with_fullname(vars_with_fullname = {})
193
+ # By default: nothing to do
194
+ end
195
+ end
196
+
182
197
  ##
183
198
  # Enhance the TimeWait class with VCD support.
184
199
  class TimeWait
@@ -254,60 +254,62 @@ module HDLRuby::Low
254
254
 
255
255
 
256
256
 
257
- # Extract and convert to verilog the TimeRepeat statements.
258
- # NOTE: work only on the current level of the block (should be called
259
- # through each_block_deep).
260
- def repeat_to_verilog!
261
- code = ""
262
- # Gather the TimeRepeat statements.
263
- repeats = self.each_statement.find_all { |st| st.is_a?(TimeRepeat) }
264
- # Remove them from the block.
265
- repeats.each { |st| self.delete_statement!(st) }
266
- # Generate them separately in timed always processes.
267
- repeats.each do |st|
268
- code << " always #{st.delay.to_verilog} begin\n"
269
-
270
- # Perform "scheduling" using the method "flatten".
271
- block = st.statement.flatten(st.statement.mode.to_s)
272
-
273
- # Declaration of "inner" part within "always".
274
- block.each_inner do |inner|
275
- # if regs.include?(inner.name) then
276
- if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
277
- code << " reg"
278
- else
279
- code << " wire"
280
- end
281
-
282
- # Variable has "base", but if there is width etc, it is not in "base".
283
- # It is determined by an if.
284
- if inner.type.base?
285
- if inner.type.base.base?
286
- code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
287
- else
288
- code << "#{inner.type.to_verilog} #{inner.to_verilog}"
289
- end
290
- else
291
- code << " #{inner.type.to_verilog}#{inner.to_verilog}"
292
- end
293
- if inner.value then
294
- # There is an initial value.
295
- code << " = #{inner.value.to_verilog}"
296
- end
297
- code << ";\n"
298
- end
299
-
300
- # Translate the block that finished scheduling.
301
- block.each_statement do |statement|
302
- code << "\n #{statement.to_verilog(block.mode.to_s)}"
303
- end
304
-
305
- FmI.fm_par.clear()
306
-
307
- code << "\n end\n\n"
308
- end
309
- return code
310
- end
257
+ # Deprecated with new TimeRepeat!
258
+ #
259
+ # # Extract and convert to verilog the TimeRepeat statements.
260
+ # # NOTE: work only on the current level of the block (should be called
261
+ # # through each_block_deep).
262
+ # def repeat_to_verilog!
263
+ # code = ""
264
+ # # Gather the TimeRepeat statements.
265
+ # repeats = self.each_statement.find_all { |st| st.is_a?(TimeRepeat) }
266
+ # # Remove them from the block.
267
+ # repeats.each { |st| self.delete_statement!(st) }
268
+ # # Generate them separately in timed always processes.
269
+ # repeats.each do |st|
270
+ # code << " always #{st.delay.to_verilog} begin\n"
271
+
272
+ # # Perform "scheduling" using the method "flatten".
273
+ # block = st.statement.flatten(st.statement.mode.to_s)
274
+
275
+ # # Declaration of "inner" part within "always".
276
+ # block.each_inner do |inner|
277
+ # # if regs.include?(inner.name) then
278
+ # if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
279
+ # code << " reg"
280
+ # else
281
+ # code << " wire"
282
+ # end
283
+
284
+ # # Variable has "base", but if there is width etc, it is not in "base".
285
+ # # It is determined by an if.
286
+ # if inner.type.base?
287
+ # if inner.type.base.base?
288
+ # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
289
+ # else
290
+ # code << "#{inner.type.to_verilog} #{inner.to_verilog}"
291
+ # end
292
+ # else
293
+ # code << " #{inner.type.to_verilog}#{inner.to_verilog}"
294
+ # end
295
+ # if inner.value then
296
+ # # There is an initial value.
297
+ # code << " = #{inner.value.to_verilog}"
298
+ # end
299
+ # code << ";\n"
300
+ # end
301
+
302
+ # # Translate the block that finished scheduling.
303
+ # block.each_statement do |statement|
304
+ # code << "\n #{statement.to_verilog(block.mode.to_s)}"
305
+ # end
306
+
307
+ # FmI.fm_par.clear()
308
+
309
+ # code << "\n end\n\n"
310
+ # end
311
+ # return code
312
+ # end
311
313
 
312
314
 
313
315
  # Process top layer of Block.
@@ -1814,6 +1816,15 @@ module HDLRuby::Low
1814
1816
  end
1815
1817
  end
1816
1818
 
1819
+
1820
+ # Generate verilog code for the TimeRepeat.
1821
+ class TimeRepeat
1822
+ def to_verilog(spc = 3)
1823
+ result = (" " * spc) + "repeat(#{self.number})" + "\n"
1824
+ result << self.statement.to_verilog(spc+3)
1825
+ end
1826
+ end
1827
+
1817
1828
  # Those who disappeared.
1818
1829
  #class SystemI
1819
1830
  #class TypeTuple
@@ -2137,10 +2148,12 @@ module HDLRuby::Low
2137
2148
  if behavior.block.is_a?(TimeBlock) then
2138
2149
  # Tell it is a time behavior for further processing.
2139
2150
  timebeh = true
2140
- # Extract and translate the TimeRepeat separately.
2141
- behavior.each_block_deep do |blk|
2142
- codeC << blk.repeat_to_verilog!
2143
- end
2151
+ # Deprecated with new TimeRepeat.
2152
+ #
2153
+ # # Extract and translate the TimeRepeat separately.
2154
+ # behavior.each_block_deep do |blk|
2155
+ # codeC << blk.repeat_to_verilog!
2156
+ # end
2144
2157
  # And generate an initial block.
2145
2158
  codeC << " initial "
2146
2159
  else
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.11.3"
2
+ VERSION = "2.11.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: HDLRuby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.3
4
+ version: 2.11.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-10 00:00:00.000000000 Z
11
+ date: 2022-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -148,6 +148,7 @@ files:
148
148
  - lib/HDLRuby/hdr_samples/ram.rb
149
149
  - lib/HDLRuby/hdr_samples/range_bench.rb
150
150
  - lib/HDLRuby/hdr_samples/register_with_code_bench.rb
151
+ - lib/HDLRuby/hdr_samples/repeat_bench.rb
151
152
  - lib/HDLRuby/hdr_samples/rom.rb
152
153
  - lib/HDLRuby/hdr_samples/rom_nest.rb
153
154
  - lib/HDLRuby/hdr_samples/ruby_fir_hw.rb