HDLRuby 2.11.12 → 3.1.0

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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.html +3274 -0
  3. data/README.md +660 -128
  4. data/ext/hruby_sim/hruby_sim_calc.c +2 -0
  5. data/lib/HDLRuby/backend/hruby_allocator.rb +2 -2
  6. data/lib/HDLRuby/backend/hruby_c_allocator.rb +7 -7
  7. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +2 -1
  8. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
  9. data/lib/HDLRuby/hdr_samples/with_bram.rb +3 -3
  10. data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +105 -0
  11. data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +69 -0
  12. data/lib/HDLRuby/hdr_samples/with_ref_expr.rb +30 -0
  13. data/lib/HDLRuby/hdr_samples/with_sequencer.rb +185 -0
  14. data/lib/HDLRuby/hdr_samples/with_sequencer_deep.rb +91 -0
  15. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +439 -0
  16. data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +89 -0
  17. data/lib/HDLRuby/hdr_samples/with_sequencer_func.rb +63 -0
  18. data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +120 -0
  19. data/lib/HDLRuby/hdrcc.rb +16 -3
  20. data/lib/HDLRuby/hdrlib.rb +1 -1
  21. data/lib/HDLRuby/hruby_db.rb +2 -2
  22. data/lib/HDLRuby/hruby_high.rb +61 -25
  23. data/lib/HDLRuby/hruby_high_fullname.rb +3 -1
  24. data/lib/HDLRuby/hruby_low.rb +2 -2
  25. data/lib/HDLRuby/hruby_low2c.rb +58 -43
  26. data/lib/HDLRuby/hruby_low2hdr.rb +66 -40
  27. data/lib/HDLRuby/hruby_low2high.rb +86 -44
  28. data/lib/HDLRuby/hruby_low2seq.rb +26 -18
  29. data/lib/HDLRuby/hruby_low2sym.rb +14 -13
  30. data/lib/HDLRuby/hruby_low2vhd.rb +78 -43
  31. data/lib/HDLRuby/hruby_low_bool2select.rb +61 -46
  32. data/lib/HDLRuby/hruby_low_casts_without_expression.rb +56 -44
  33. data/lib/HDLRuby/hruby_low_cleanup.rb +18 -16
  34. data/lib/HDLRuby/hruby_low_fix_types.rb +64 -32
  35. data/lib/HDLRuby/hruby_low_mutable.rb +53 -118
  36. data/lib/HDLRuby/hruby_low_resolve.rb +26 -31
  37. data/lib/HDLRuby/hruby_low_with_bool.rb +33 -16
  38. data/lib/HDLRuby/hruby_low_with_port.rb +3 -3
  39. data/lib/HDLRuby/hruby_low_with_var.rb +23 -9
  40. data/lib/HDLRuby/hruby_low_without_concat.rb +19 -13
  41. data/lib/HDLRuby/hruby_low_without_namespace.rb +47 -32
  42. data/lib/HDLRuby/hruby_low_without_parinseq.rb +18 -12
  43. data/lib/HDLRuby/hruby_low_without_select.rb +36 -23
  44. data/lib/HDLRuby/hruby_low_without_subsignals.rb +79 -39
  45. data/lib/HDLRuby/hruby_rcsim.rb +79 -64
  46. data/lib/HDLRuby/hruby_rsim.rb +64 -15
  47. data/lib/HDLRuby/hruby_rsim_mute.rb +2 -3
  48. data/lib/HDLRuby/hruby_rsim_vcd.rb +28 -25
  49. data/lib/HDLRuby/hruby_types.rb +5 -5
  50. data/lib/HDLRuby/hruby_values.rb +19 -8
  51. data/lib/HDLRuby/hruby_verilog.rb +191 -65
  52. data/lib/HDLRuby/hruby_verilog_name.rb +49 -42
  53. data/lib/HDLRuby/soft/stacks.rb +219 -0
  54. data/lib/HDLRuby/std/bram.rb +9 -5
  55. data/lib/HDLRuby/std/clocks.rb +1 -1
  56. data/lib/HDLRuby/std/fsm.rb +39 -10
  57. data/lib/HDLRuby/std/sequencer.rb +2085 -0
  58. data/lib/HDLRuby/std/sequencer_func.rb +533 -0
  59. data/lib/HDLRuby/std/sequencer_sync.rb +400 -0
  60. data/lib/HDLRuby/std/std.rb +13 -0
  61. data/lib/HDLRuby/version.rb +1 -1
  62. data/tuto/adder_sat_flags_vcd.png +0 -0
  63. data/tuto/addsub_vcd.png +0 -0
  64. data/tuto/alu_vcd.png +0 -0
  65. data/tuto/bit_pong_vcd.png +0 -0
  66. data/tuto/checksum_vcd.png +0 -0
  67. data/tuto/circuit_hdr.odg +0 -0
  68. data/tuto/circuit_hdr.png +0 -0
  69. data/tuto/circuit_hie.odg +0 -0
  70. data/tuto/circuit_hie.png +0 -0
  71. data/tuto/circuit_view.odg +0 -0
  72. data/tuto/circuit_view.png +0 -0
  73. data/tuto/clock_counter_vcd.png +0 -0
  74. data/tuto/counter_ext_vcd.png +0 -0
  75. data/tuto/fact_vcd.png +0 -0
  76. data/tuto/hw_flow.odg +0 -0
  77. data/tuto/hw_flow.png +0 -0
  78. data/tuto/maxxer_vcd.png +0 -0
  79. data/tuto/pingpong0_vcd.png +0 -0
  80. data/tuto/pingpong1_vcd.png +0 -0
  81. data/tuto/pingpong2_vcd.png +0 -0
  82. data/tuto/ram_vcd.png +0 -0
  83. data/tuto/serializer_vcd.png +0 -0
  84. data/tuto/sw_flow.odg +0 -0
  85. data/tuto/sw_flow.png +0 -0
  86. data/tuto/the_counter_vcd.png +0 -0
  87. data/tuto/tutorial_sw.html +2359 -0
  88. data/tuto/tutorial_sw.md +2890 -0
  89. data/tuto/tutorial_sw.pdf +0 -0
  90. data/tuto/tutorial_sw_jp.md +417 -0
  91. metadata +46 -2
@@ -88,8 +88,8 @@ module HDLRuby::High
88
88
 
89
89
 
90
90
 
91
- ## Extends the SystemT class for hybrid Ruby-C simulation.
92
91
  class SystemT
92
+ ## Extends the SystemT class for hybrid Ruby-C simulation.
93
93
 
94
94
  attr_reader :rcsystemT # The access to the C version of the systemT
95
95
 
@@ -141,8 +141,8 @@ module HDLRuby::High
141
141
  end
142
142
 
143
143
 
144
- ## Extends the Scope class for hybrid Ruby-C simulation.
145
144
  class Scope
145
+ ## Extends the Scope class for hybrid Ruby-C simulation.
146
146
 
147
147
  attr_reader :rcscope # The access to the C version of the scope.
148
148
 
@@ -185,25 +185,26 @@ module HDLRuby::High
185
185
  end)
186
186
  end
187
187
 
188
- # # Create and add the behaviors.
189
- # if self.each_behavior.any? then
190
- # RCSim.rcsim_add_scope_behaviors(@rcscope,
191
- # self.each_behavior.map do |beh|
192
- # # beh.to_rcsim(@rcscope)
193
- # beh.to_rcsim(subowner)
194
- # end)
195
- # end
196
-
197
- # # Create and add the connections.
198
- # if self.each_connection.any? then
199
- # RCSim.rcsim_add_scope_behaviors(@rcscope,
200
- # self.each_connection.map do |cxt|
201
- # # cxt.to_rcsim(@rcscope)
202
- # cxt.to_rcsim(subowner)
203
- # end)
204
- # end
205
- rcbehs = self.each_behavior.map {|beh| beh.to_rcsim(subowner)} +
206
- self.each_connection.map {|cxt| cxt.to_rcsim(subowner) }
188
+ # Create and add the behaviors and connections.
189
+ rcbehs = self.each_behavior.map {|beh| beh.to_rcsim(subowner)} # +
190
+ # self.each_connection.map {|cxt| cxt.to_rcsim(subowner) }
191
+ self.each_connection do |cnx|
192
+ # ICIICI
193
+ if !cnx.right.is_a?(RefObject) then
194
+ rcbehs << cnx.to_rcsim(subowner)
195
+ else
196
+ # puts "cnx.left.object=#{cnx.left.object.fullname} cnx.right.object=#{cnx.right.object.fullname}"
197
+ rcbehs << cnx.to_rcsim(subowner)
198
+ if cnx.left.is_a?(RefObject) then
199
+ sigL = cnx.left.object
200
+ prtL = sigL.parent
201
+ if prtL.is_a?(SystemT) and prtL.each_inout.any?{|e| e.object_id == sigL.object_id} then
202
+ # puts "write to right with sigL=#{sigL.fullname}."
203
+ rcbehs << Connection.new(cnx.right.clone,cnx.left.clone).to_rcsim(subowner)
204
+ end
205
+ end
206
+ end
207
+ end
207
208
  if rcbehs.any? then
208
209
  RCSim.rcsim_add_scope_behaviors(@rcscope,rcbehs)
209
210
  end
@@ -217,8 +218,8 @@ module HDLRuby::High
217
218
 
218
219
 
219
220
 
220
- ## Extends the Type class for hybrid Ruby-C simulation.
221
221
  class Type
222
+ ## Extends the Type class for hybrid Ruby-C simulation.
222
223
 
223
224
  attr_reader :rctype # The access to the C version of the scope.
224
225
 
@@ -238,8 +239,8 @@ module HDLRuby::High
238
239
  end
239
240
  end
240
241
 
241
- ## Extends the TypeDef class for hybrid Ruby-C simulation.
242
242
  class TypeDef
243
+ ## Extends the TypeDef class for hybrid Ruby-C simulation.
243
244
 
244
245
  # Generate the C description of the type.
245
246
  def to_rcsim
@@ -249,8 +250,8 @@ module HDLRuby::High
249
250
  end
250
251
  end
251
252
 
252
- ## Extends the TypeVector class for hybrid Ruby-C simulation.
253
253
  class TypeVector
254
+ ## Extends the TypeVector class for hybrid Ruby-C simulation.
254
255
 
255
256
  # Generate the C description of the type.
256
257
  def to_rcsim
@@ -260,8 +261,8 @@ module HDLRuby::High
260
261
  end
261
262
  end
262
263
 
263
- ## Extends the TypeTuple class for hybrid Ruby-C simulation.
264
264
  class TypeTuple
265
+ ## Extends the TypeTuple class for hybrid Ruby-C simulation.
265
266
  # Add the possibility to change the direction.
266
267
  def direction=(dir)
267
268
  @direction = dir == :little ? :little : :big
@@ -276,8 +277,9 @@ module HDLRuby::High
276
277
  end
277
278
 
278
279
 
279
- ## Extends the TypeStruct class for hybrid Ruby-C simulation.
280
280
  class TypeStruct
281
+ ## Extends the TypeStruct class for hybrid Ruby-C simulation.
282
+
281
283
  # Add the possibility to change the direction.
282
284
  def direction=(dir)
283
285
  @direction = dir == :little ? :little : :big
@@ -335,6 +337,18 @@ module HDLRuby::High
335
337
  self.block.each_inner do |inner|
336
338
  refs.delete_if {|r| r.name == inner.name }
337
339
  end
340
+ # The get the left references: the will be removed from the
341
+ # events.
342
+ left_refs = self.block.each_node_deep.select do |node|
343
+ node.is_a?(RefObject) && node.leftvalue? &&
344
+ !node.parent.is_a?(RefObject)
345
+ end.to_a
346
+ # Keep only one left ref per signal.
347
+ left_refs.uniq! { |node| node.fullname }
348
+ # Remove the left refs.
349
+ left_refs.each do |l|
350
+ refs.delete_if {|r| r.fullname == l.fullname }
351
+ end
338
352
  # Generate the event.
339
353
  events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
340
354
  # Add them to the behavior for further processing.
@@ -374,19 +388,19 @@ module HDLRuby::High
374
388
  end
375
389
 
376
390
 
377
- ## Extends the Behavior class for hybrid Ruby-C simulation.
378
391
  class Behavior
392
+ ## Extends the Behavior class for hybrid Ruby-C simulation.
379
393
  include RCSimBehavior
380
394
  end
381
395
 
382
- ## Extends the TimeBehavior class for hybrid Ruby-C simulation.
383
396
  class TimeBehavior
397
+ ## Extends the TimeBehavior class for hybrid Ruby-C simulation.
384
398
  include RCSimBehavior
385
399
  end
386
400
 
387
401
 
388
- ## Extends the Event class for hybrid Ruby-C simulation.
389
402
  class Event
403
+ ## Extends the Event class for hybrid Ruby-C simulation.
390
404
 
391
405
  attr_reader :rcevent
392
406
 
@@ -404,8 +418,8 @@ module HDLRuby::High
404
418
  end
405
419
 
406
420
 
407
- ## Extends the SignalI class for hybrid Ruby-C simulation.
408
421
  class SignalI
422
+ ## Extends the SignalI class for hybrid Ruby-C simulation.
409
423
 
410
424
  attr_reader :rcsignalI
411
425
 
@@ -436,8 +450,8 @@ module HDLRuby::High
436
450
  end
437
451
 
438
452
 
439
- ## Extends the SignalC class for hybrid Ruby-C simulation.
440
453
  class SignalC
454
+ ## Extends the SignalC class for hybrid Ruby-C simulation.
441
455
 
442
456
  attr_reader :rcsignalC
443
457
 
@@ -459,8 +473,8 @@ module HDLRuby::High
459
473
  end
460
474
 
461
475
 
462
- ## Extends the SystemI class for hybrid Ruby-C simulation.
463
476
  class SystemI
477
+ ## Extends the SystemI class for hybrid Ruby-C simulation.
464
478
 
465
479
  attr_reader :rcsystemI
466
480
 
@@ -496,19 +510,19 @@ module HDLRuby::High
496
510
  end
497
511
 
498
512
 
499
- ## Extends the Chunk class for hybrid Ruby-C simulation.
500
513
  class Chunk
514
+ ## Extends the Chunk class for hybrid Ruby-C simulation.
501
515
  # TODO!!
502
516
  end
503
517
 
504
- ## Extends the Code class for hybrid Ruby-C simulation.
505
518
  class Code
519
+ ## Extends the Code class for hybrid Ruby-C simulation.
506
520
  # TODO!!
507
521
  end
508
522
 
509
523
 
510
- ## Extends the Statement class for hybrid Ruby-C simulation.
511
524
  class Statement
525
+ ## Extends the Statement class for hybrid Ruby-C simulation.
512
526
 
513
527
  attr_reader :rcstatement
514
528
 
@@ -519,8 +533,8 @@ module HDLRuby::High
519
533
  end
520
534
 
521
535
 
522
- ## Extends the Transmit class for hybrid Ruby-C simulation.
523
536
  class Transmit
537
+ ## Extends the Transmit class for hybrid Ruby-C simulation.
524
538
  attr_reader :rcstatement
525
539
 
526
540
  # Generate the C description of the transmit.
@@ -534,8 +548,8 @@ module HDLRuby::High
534
548
  end
535
549
 
536
550
 
537
- ## Extends the Print class for hybrid Ruby-C simulation.
538
551
  class Print
552
+ ## Extends the Print class for hybrid Ruby-C simulation.
539
553
  attr_reader :rcstatement
540
554
 
541
555
  # Generate the C description of the print.
@@ -554,8 +568,8 @@ module HDLRuby::High
554
568
  end
555
569
 
556
570
 
557
- ## Extends the TimeTerminate class for hybrid Ruby-C simulation.
558
571
  class TimeTerminate
572
+ ## Extends the TimeTerminate class for hybrid Ruby-C simulation.
559
573
  attr_reader :rcstatement
560
574
 
561
575
  # Generate the C description of the terminate.
@@ -567,15 +581,15 @@ module HDLRuby::High
567
581
  end
568
582
  end
569
583
 
570
- ## Extends the Configure class for hybrid Ruby-C simulation.
571
584
  class Configure
585
+ ## Extends the Configure class for hybrid Ruby-C simulation.
572
586
  attr_reader :rcstatement
573
587
  # TODO!!!
574
588
  end
575
589
 
576
590
 
577
- ## Extends the If class for hybrid Ruby-C simulation.
578
591
  class If
592
+ ## Extends the If class for hybrid Ruby-C simulation.
579
593
  attr_reader :rcstatement
580
594
 
581
595
  # Generate the C description of the hardware if.
@@ -597,13 +611,13 @@ module HDLRuby::High
597
611
  end
598
612
 
599
613
 
600
- ## Extends the When class for hybrid Ruby-C simulation.
601
614
  class When
615
+ ## Extends the When class for hybrid Ruby-C simulation.
602
616
  # Nothing to add.
603
617
  end
604
618
 
605
- ## Extends the Case class for hybrid Ruby-C simulation.
606
619
  class Case
620
+ ## Extends the Case class for hybrid Ruby-C simulation.
607
621
  attr_reader :rcstatement
608
622
 
609
623
  # Generate the C description of the hardware case.
@@ -625,13 +639,13 @@ module HDLRuby::High
625
639
  end
626
640
 
627
641
 
628
- ## Extends the Delay class for hybrid Ruby-C simulation.
629
642
  class Delay
643
+ ## Extends the Delay class for hybrid Ruby-C simulation.
630
644
  # Nothing to do.
631
645
  end
632
646
 
633
- ## Extends the TimeWait class for hybrid Ruby-C simulation.
634
647
  class TimeWait
648
+ ## Extends the TimeWait class for hybrid Ruby-C simulation.
635
649
  attr_reader :rcstatement
636
650
 
637
651
  # Generate the C description of the time wait.
@@ -645,8 +659,8 @@ module HDLRuby::High
645
659
  end
646
660
 
647
661
 
648
- ## Extends the TimeRepeat class for hybrid Ruby-C simulation.
649
662
  class TimeRepeat
663
+ ## Extends the TimeRepeat class for hybrid Ruby-C simulation.
650
664
  attr_reader :rcstatement
651
665
 
652
666
  # Generate the C description of the hardware case.
@@ -701,24 +715,25 @@ module HDLRuby::High
701
715
  end
702
716
  end
703
717
 
704
- ## Extends the Block class for hybrid Ruby-C simulation.
705
718
  class Block
719
+ ## Extends the Block class for hybrid Ruby-C simulation.
706
720
  include RCSimBlock
707
721
  end
708
722
 
709
- ## Extends the TimeBlock class for hybrid Ruby-C simulation.
710
723
  class TimeBlock
724
+ ## Extends the TimeBlock class for hybrid Ruby-C simulation.
711
725
  include RCSimBlock
712
726
  end
713
727
 
714
728
 
715
- ## Extends the Connection class for hybrid Ruby-C simulation.
716
729
  class Connection
730
+ ## Extends the Connection class for hybrid Ruby-C simulation.
717
731
  attr_reader :rcbehavior
718
732
 
719
733
  # Add recursively any event to +rcevs+ for activativing the
720
734
  # connection from signal +sig+ attached to +rcbehavior+
721
735
  def self.add_rcevents(sig,rcevs,rcbehavior)
736
+ # puts "add_rcevents for sig=#{sig.fullname}"
722
737
  # Recurse on sub signals if any.
723
738
  sig.each_signal do |sub|
724
739
  Connection.add_rcevents(sub,rcevs,rcbehavior)
@@ -767,8 +782,8 @@ module HDLRuby::High
767
782
  end
768
783
 
769
784
 
770
- ## Extends the Expression class for hybrid Ruby-C simulation.
771
785
  class Expression
786
+ ## Extends the Expression class for hybrid Ruby-C simulation.
772
787
 
773
788
  # attr_reader :rcexpression
774
789
 
@@ -779,8 +794,8 @@ module HDLRuby::High
779
794
  end
780
795
 
781
796
 
782
- ## Extends the Value class for hybrid Ruby-C simulation.
783
797
  class Value
798
+ ## Extends the Value class for hybrid Ruby-C simulation.
784
799
  # attr_reader :rcexpression
785
800
 
786
801
  # Generate the C description of the value.
@@ -815,8 +830,8 @@ module HDLRuby::High
815
830
  end
816
831
  end
817
832
 
818
- ## Extends the StringE class for hybrid Ruby-C simulation.
819
833
  class StringE
834
+ ## Extends the StringE class for hybrid Ruby-C simulation.
820
835
 
821
836
  # Generate the C description of the value.
822
837
  def to_rcsim
@@ -826,8 +841,8 @@ module HDLRuby::High
826
841
  end
827
842
 
828
843
 
829
- ## Extends the Cast class for hybrid Ruby-C simulation.
830
844
  class Cast
845
+ ## Extends the Cast class for hybrid Ruby-C simulation.
831
846
  # attr_reader :rcexpression
832
847
 
833
848
  # Generate the C description of the cast.
@@ -846,13 +861,13 @@ module HDLRuby::High
846
861
  end
847
862
 
848
863
 
849
- ## Extends the Operation class for hybrid Ruby-C simulation.
850
864
  class Operation
865
+ ## Extends the Operation class for hybrid Ruby-C simulation.
851
866
  # Nothing to do.
852
867
  end
853
868
 
854
- ## Extends the Unary class for hybrid Ruby-C simulation.
855
869
  class Unary
870
+ ## Extends the Unary class for hybrid Ruby-C simulation.
856
871
  attr_reader :rcexpression
857
872
 
858
873
  # Generate the C description of the unary operation.
@@ -863,8 +878,8 @@ module HDLRuby::High
863
878
  end
864
879
  end
865
880
 
866
- ## Extends the Binary class for hybrid Ruby-C simulation.
867
881
  class Binary
882
+ ## Extends the Binary class for hybrid Ruby-C simulation.
868
883
  # attr_reader :rcexpression
869
884
 
870
885
  # Generate the C description of the binary operation.
@@ -877,8 +892,8 @@ module HDLRuby::High
877
892
  end
878
893
 
879
894
 
880
- ## Extends the Select class for hybrid Ruby-C simulation.
881
895
  class Select
896
+ ## Extends the Select class for hybrid Ruby-C simulation.
882
897
  # attr_reader :rcexpression
883
898
 
884
899
  # Generate the C description of the select operation.
@@ -898,8 +913,8 @@ module HDLRuby::High
898
913
  end
899
914
 
900
915
 
901
- ## Extends the Concat class for hybrid Ruby-C simulation.
902
916
  class Concat
917
+ ## Extends the Concat class for hybrid Ruby-C simulation.
903
918
  # attr_reader :rcexpression
904
919
 
905
920
  # Generate the C description of the concat operation.
@@ -920,8 +935,8 @@ module HDLRuby::High
920
935
 
921
936
 
922
937
 
923
- ## Extends the Ref class for hybrid Ruby-C simulation.
924
938
  class Ref
939
+ ## Extends the Ref class for hybrid Ruby-C simulation.
925
940
  # attr_reader :rcref
926
941
  # alias_method :rcexpression, :rcref
927
942
 
@@ -932,8 +947,8 @@ module HDLRuby::High
932
947
  end
933
948
 
934
949
 
935
- ## Extends the RefConcat class for hybrid Ruby-C simulation.
936
950
  class RefConcat
951
+ ## Extends the RefConcat class for hybrid Ruby-C simulation.
937
952
  # attr_reader :rcref
938
953
  # alias_method :rcexpression, :rcref
939
954
 
@@ -953,8 +968,8 @@ module HDLRuby::High
953
968
  end
954
969
 
955
970
 
956
- ## Extends the RefIndex class for hybrid Ruby-C simulation.
957
971
  class RefIndex
972
+ ## Extends the RefIndex class for hybrid Ruby-C simulation.
958
973
  # attr_reader :rcref
959
974
  # alias_method :rcexpression, :rcref
960
975
 
@@ -967,8 +982,8 @@ module HDLRuby::High
967
982
  end
968
983
 
969
984
 
970
- ## Extends the RefRange class for hybrid Ruby-C simulation.
971
985
  class RefRange
986
+ ## Extends the RefRange class for hybrid Ruby-C simulation.
972
987
  # attr_reader :rcref
973
988
  # alias_method :rcexpression, :rcref
974
989
 
@@ -983,14 +998,14 @@ module HDLRuby::High
983
998
  end
984
999
 
985
1000
 
986
- ## Extends the RefName class for hybrid Ruby-C simulation.
987
1001
  class RefName
1002
+ ## Extends the RefName class for hybrid Ruby-C simulation.
988
1003
  # Should not be used with rcsim.
989
1004
  end
990
1005
 
991
1006
 
992
- ## Extends the RefThis class for hybrid Ruby-C simulation.
993
1007
  class RefThis
1008
+ ## Extends the RefThis class for hybrid Ruby-C simulation.
994
1009
  # attr_reader :rcref
995
1010
  # alias_method :rcexpression, :rcref
996
1011
 
@@ -1001,8 +1016,8 @@ module HDLRuby::High
1001
1016
  end
1002
1017
 
1003
1018
 
1004
- ## Extends the RefObject class for hybrid Ruby-C simulation.
1005
1019
  class RefObject
1020
+ ## Extends the RefObject class for hybrid Ruby-C simulation.
1006
1021
  # attr_reader :rcref
1007
1022
  # alias_method :rcexpression, :rcref
1008
1023
 
@@ -12,13 +12,17 @@ module HDLRuby::High
12
12
  #
13
13
  ########################################################################
14
14
 
15
- ##
16
- # Enhance a system type with Ruby simulation.
15
+
16
+
17
17
  class SystemT
18
+ ## Enhance a system type with Ruby simulation.
18
19
 
19
20
  # Tell if the simulation is in multithread mode or not.
20
21
  attr_reader :multithread
21
22
 
23
+ # The current global time.
24
+ attr_reader :time
25
+
22
26
  ## Add untimed objet +obj+
23
27
  def add_untimed(obj)
24
28
  @untimeds << obj
@@ -66,6 +70,7 @@ module HDLRuby::High
66
70
  @sig_active.each do |sig|
67
71
  next if (sig.c_value.eql?(sig.f_value))
68
72
  # next if (sig.c_value.to_vstr == sig.f_value.to_vstr)
73
+ # puts "for sig=#{sig.fullname}"
69
74
  sig.each_anyedge { |beh| @sig_exec << beh }
70
75
  if (sig.c_value.zero?) then
71
76
  # puts "sig.c_value=#{sig.c_value.content}"
@@ -78,6 +83,7 @@ module HDLRuby::High
78
83
  @sig_active.each { |sig| sig.c_value = sig.f_value }
79
84
  # puts "first @sig_exec.size=#{@sig_exec.size}"
80
85
  @sig_exec.uniq! {|beh| beh.object_id }
86
+ # puts "now @sig_exec.size=#{@sig_exec.size}"
81
87
  # Display the activated signals.
82
88
  @sig_active.each do |sig|
83
89
  if !shown_values[sig].eql?(sig.f_value) then
@@ -93,9 +99,10 @@ module HDLRuby::High
93
99
  @sig_exec.clear
94
100
  @sig_active.uniq! {|sig| sig.object_id }
95
101
  # puts "@sig_active.size=#{@sig_active.size}"
96
- # Advance time.
102
+ # Compute the nearest next time stamp.
97
103
  @time = (@timed_behaviors.min {|b0,b1| b0.time <=> b1.time }).time
98
104
  end
105
+ # puts "@time=#{@time}"
99
106
  # Display the time
100
107
  self.show_time
101
108
  end
@@ -322,9 +329,8 @@ module HDLRuby::High
322
329
  end
323
330
 
324
331
 
325
- ##
326
- # Describes scopes of system types.
327
332
  class Scope
333
+ ## Enhance a scope with Ruby simulation.
328
334
 
329
335
  ## Initialize the simulation for system +systemT+.
330
336
  def init_sim(systemT)
@@ -335,7 +341,26 @@ module HDLRuby::High
335
341
  # Recurse on the systemI.
336
342
  self.each_systemI { |sys| sys.init_sim(systemT) }
337
343
  # Recurse on the connections.
338
- self.each_connection { |cnx| cnx.init_sim(systemT) }
344
+ # self.each_connection { |cnx| cnx.init_sim(systemT) }
345
+ self.each_connection do |cnx|
346
+ # Connection to a real expression?
347
+ if !cnx.right.is_a?(RefObject) then
348
+ # Yes.
349
+ cnx.init_sim(systemT)
350
+ else
351
+ # No, maybe the reverse connection is also required.
352
+ # puts "cnx.left.object=#{cnx.left.object.fullname} cnx.right.object=#{cnx.right.object.fullname}"
353
+ cnx.init_sim(systemT)
354
+ if cnx.left.is_a?(RefObject) then
355
+ sigL = cnx.left.object
356
+ prtL = sigL.parent
357
+ if prtL.is_a?(SystemT) and prtL.each_inout.any?{|e| e.object_id == sigL.object_id} then
358
+ # puts "write to right with sigL=#{sigL.fullname}."
359
+ Connection.new(cnx.right.clone,cnx.left.clone).init_sim(systemT)
360
+ end
361
+ end
362
+ end
363
+ end
339
364
  # Recurse on the sub scopes.
340
365
  self.each_scope { |sco| sco.init_sim(systemT) }
341
366
  end
@@ -393,9 +418,21 @@ module HDLRuby::High
393
418
  # Keep only one ref per signal.
394
419
  refs.uniq! { |node| node.fullname }
395
420
  # puts "refs=#{refs.map {|node| node.fullname}}"
421
+ # The get the left references: the will be removed from the
422
+ # events.
423
+ left_refs = self.block.each_node_deep.select do |node|
424
+ node.is_a?(RefObject) && node.leftvalue? &&
425
+ !node.parent.is_a?(RefObject)
426
+ end.to_a
427
+ # Keep only one left ref per signal.
428
+ left_refs.uniq! { |node| node.fullname }
396
429
  # Remove the inner signals from the list.
397
430
  self.block.each_inner do |inner|
398
- refs.delete_if {|r| r.name == inner.name }
431
+ refs.delete_if {|r| r.fullname == inner.fullname }
432
+ end
433
+ # Remove the left refs.
434
+ left_refs.each do |l|
435
+ refs.delete_if {|r| r.fullname == l.fullname }
399
436
  end
400
437
  # Generate the event.
401
438
  events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
@@ -494,6 +531,9 @@ module HDLRuby::High
494
531
 
495
532
  ## Initialize the simulation for +systemT+
496
533
  def init_sim(systemT)
534
+ # Initialize the local time to -1
535
+ @time = -1
536
+ @sim = systemT
497
537
  # Recurse on the sub signals if any.
498
538
  if self.each_signal.any? then
499
539
  self.each_signal {|sig| sig.init_sim(systemT) }
@@ -569,12 +609,16 @@ module HDLRuby::High
569
609
 
570
610
  ## Assigns +value+ the the reference.
571
611
  def assign(mode,value)
572
- # Set the next value.
573
- @f_value = value
612
+ # # Set the next value.
613
+ # @f_value = value
574
614
  # Set the mode.
575
615
  @mode = mode
576
- # puts "assign #{value.content} (#{value.content.class}) with self.type.width=#{self.type.width} while value.type.width=#{value.type.width}" if self.name.to_s.include?("xnor")
577
- @f_value = value.cast(self.type) # Cast not always inserted by HDLRuby normally
616
+ # @f_value = value.cast(self.type) # Cast not always inserted by HDLRuby normally
617
+ if @sim.time > @time or !value.impedence? then
618
+ # puts "assign #{value.content} to #{self.fullname}"
619
+ @f_value = value.cast(self.type) # Cast not always inserted by HDLRuby normally
620
+ @time = @sim.time
621
+ end
578
622
  end
579
623
 
580
624
  ## Assigns +value+ at +index+ (integer or range).
@@ -673,7 +717,7 @@ module HDLRuby::High
673
717
 
674
718
  ## Executes the statement.
675
719
  def execute(mode)
676
- # puts "execute Transmit in mode=#{mode} for left=#{self.left.object.name}"
720
+ # puts "execute Transmit in mode=#{mode} for left=#{self.left.object.fullname}" if left.is_a?(RefObject)
677
721
  self.left.assign(mode,self.right.execute(mode))
678
722
  end
679
723
  end
@@ -685,7 +729,11 @@ module HDLRuby::High
685
729
  ## Initialize the simulation for system +systemT+.
686
730
  def init_sim(systemT)
687
731
  self.yes.init_sim(systemT)
688
- self.each_noif { |cond,stmnt| stmnt.init_sim(systemT) }
732
+ # self.each_noif { |cond,stmnt| stmnt.init_sim(systemT) }
733
+ self.each_noif do |cond,stmnt|
734
+ cond.init_sim(systemT)
735
+ stmnt.init_sim(systemT)
736
+ end
689
737
  self.no.init_sim(systemT) if self.no
690
738
  end
691
739
 
@@ -959,8 +1007,9 @@ module HDLRuby::High
959
1007
 
960
1008
  ## Executes the statement.
961
1009
  def execute(mode)
962
- # puts "connection left=#{left} right=#{right}"
963
- self.left.assign(mode,self.right.execute(mode))
1010
+ # puts "connection left=#{left.object.fullname}"
1011
+ # self.left.assign(mode,self.right.execute(mode))
1012
+ self.left.assign(:seq,self.right.execute(mode))
964
1013
  end
965
1014
  end
966
1015
 
@@ -1,14 +1,13 @@
1
1
  require "HDLRuby/hruby_rsim"
2
2
 
3
3
  ##
4
- # Library for enhancing the Ruby simulator with VCD support
4
+ # Library for enhancing the Ruby simulator with muted output support
5
5
  #
6
6
  ########################################################################
7
7
  module HDLRuby::High
8
8
 
9
- ##
10
- # Enhance the system type class with VCD support.
11
9
  class SystemT
10
+ # Enhance the system type class with mute support.
12
11
 
13
12
  ## Initializes the displayer for generating a vcd on +vcdout+
14
13
  def show_init(vcdout)