HDLRuby 2.7.11 → 2.10.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.
@@ -135,6 +135,8 @@ module HDLRuby::Low
135
135
  objs.each { |obj| res << " " << Low2C.make_name(obj) << "();\n" }
136
136
  # Sets the top systemT.
137
137
  res << " top_system = " << Low2C.obj_name(top) << ";\n"
138
+ # Enable it.
139
+ res << " set_enable_system(top_system,1);\n"
138
140
  # Starts the simulation.
139
141
  res<< " hruby_sim_core(\"#{name}\",#{init_visualizer},-1);\n"
140
142
  # Close the main.
@@ -170,6 +172,7 @@ module HDLRuby::Low
170
172
  # is the list of extra h files to include.
171
173
  # def to_c(level = 0, *hnames)
172
174
  def to_c(res, level = 0, *hnames)
175
+ # puts "SystemT.to_c with name=#{Low2C.obj_name(self)}#{@wrapper ? " and wrapper=#{Low2C.obj_name(@wrapper)}" : ""}"
173
176
  # The header
174
177
  # res = Low2C.includes(*hnames)
175
178
  res << Low2C.includes(*hnames)
@@ -179,7 +182,16 @@ module HDLRuby::Low
179
182
 
180
183
  # Generate the signals of the system.
181
184
  # self.each_signal { |signal| signal.to_c(level) }
182
- self.each_signal { |signal| signal.to_c(res,level) }
185
+ if ((defined? @wrapper) && @wrapper) then
186
+ # It is a reconfiguring system, alias the signals.
187
+ wrap_signals = @wrapper.each_signal.to_a
188
+ self.each_signal.with_index do |signal,i|
189
+ signal.to_c_alias(res,wrap_signals[i],level)
190
+ end
191
+ else
192
+ # It is a single system, default generation.
193
+ self.each_signal { |signal| signal.to_c(res,level) }
194
+ end
183
195
 
184
196
  # Generate the code for all the blocks included in the system.
185
197
  self.scope.each_scope_deep do |scope|
@@ -686,6 +698,10 @@ module HDLRuby::Low
686
698
  res << "behavior->owner = NULL;\n"
687
699
  end
688
700
 
701
+ # Set the behavior as not enabled. */
702
+ res << " " * (level+1)*3
703
+ res << "behavior->enabled = 0;\n"
704
+
689
705
  # Set the behavior as inactive. */
690
706
  res << " " * (level+1)*3
691
707
  res << "behavior->activated = 0;\n"
@@ -842,11 +858,8 @@ module HDLRuby::Low
842
858
  # +level+ is the hierachical level of the object.
843
859
  # def to_c(level = 0)
844
860
  def to_c(res,level = 0)
845
- # The resulting string.
846
- # res = ""
847
-
861
+ # puts "Signal.to_c with name: #{Low2C.obj_name(self)}"
848
862
  # Declare the global variable holding the signal.
849
- # res << "SignalI #{self.to_c_signal(level+1)};\n\n"
850
863
  res << "SignalI "
851
864
  self.to_c_signal(res,level+1)
852
865
  res << ";\n\n"
@@ -854,6 +867,7 @@ module HDLRuby::Low
854
867
  # The header of the signal generation.
855
868
  res << " " * level*3
856
869
  res << "SignalI " << Low2C.make_name(self) << "() {\n"
870
+
857
871
  # res << " " * level*3
858
872
  # res << "Value l,r,d;\n"
859
873
  # res << " " * (level+1)*3
@@ -866,7 +880,6 @@ module HDLRuby::Low
866
880
  # Sets the global variable of the signal.
867
881
  res << "\n"
868
882
  res << " " * (level+1)*3
869
- # res << "#{self.to_c_signal(level+1)} = signalI;\n"
870
883
  self.to_c_signal(res,level+1)
871
884
  res << " = signalI;\n"
872
885
 
@@ -958,6 +971,43 @@ module HDLRuby::Low
958
971
 
959
972
  return res;
960
973
  end
974
+
975
+ ## Generates the C text of the equivalent HDLRuby code in case
976
+ # the signals is actually an alias to another signal.
977
+ # +other+ is the target signal of the alias.
978
+ # +level+ is the hierachical level of the object.
979
+ def to_c_alias(res,target,level = 0)
980
+ # puts "Signal.to_c_alias with name: #{Low2C.obj_name(self)}"
981
+ # The resulting string.
982
+ # res = ""
983
+
984
+ # Declare the global variable holding the signal.
985
+ res << "SignalI "
986
+ self.to_c_signal(res,level+1)
987
+ res << ";\n\n"
988
+
989
+ # The header of the signal generation.
990
+ res << " " * level*3
991
+ res << "SignalI " << Low2C.make_name(self) << "() {\n"
992
+
993
+ res << "SignalI signalI = #{Low2C.obj_name(target)};\n"
994
+
995
+ # Sets the global variable of the signal.
996
+ res << "\n"
997
+ res << " " * (level+1)*3
998
+ self.to_c_signal(res,level+1)
999
+ res << " = signalI;\n"
1000
+
1001
+ # Generate the return of the signal.
1002
+ res << "\n"
1003
+ res << " " * (level+1)*3
1004
+ res << "return signalI;\n"
1005
+
1006
+ # Close the signal.
1007
+ res << " " * level*3
1008
+ res << "};\n\n"
1009
+ return res
1010
+ end
961
1011
  end
962
1012
 
963
1013
 
@@ -999,9 +1049,22 @@ module HDLRuby::Low
999
1049
  # Set the name
1000
1050
  res << " " * (level+1)*3
1001
1051
  res << "systemI->name = \"#{self.name}\";\n"
1002
- # Set the type.
1052
+ # # Set the type.
1053
+ # res << " " * (level+1)*3
1054
+ # res << "systemI->system = " << Low2C.obj_name(self.systemT) << ";\n"
1055
+ # Set the systems.
1056
+ num_sys = self.each_systemT.to_a.size
1003
1057
  res << " " * (level+1)*3
1004
- res << "systemI->system = " << Low2C.obj_name(self.systemT) << ";\n"
1058
+ res << "systemI->num_systems = #{num_sys};\n"
1059
+ res << " " * (level+1)*3
1060
+ res << "systemI->systems = calloc(sizeof(SystemT), #{num_sys});\n"
1061
+ self.each_systemT.with_index do |sysT,i|
1062
+ res << " " * (level+1)*3
1063
+ res << "systemI->systems[#{i}] = #{Low2C.obj_name(sysT)};\n"
1064
+ end
1065
+
1066
+ # Configure the instance to current systemT.
1067
+ res << (" " * (level*3)) << "configure(systemI,0);\n"
1005
1068
 
1006
1069
  # Generate the return of the signal.
1007
1070
  res << "\n"
@@ -1100,6 +1163,10 @@ module HDLRuby::Low
1100
1163
  res << "code->owner = NULL;\n"
1101
1164
  end
1102
1165
 
1166
+ # Set the code as enabled (for now, may change in a near future). */
1167
+ res << " " * (level+1)*3
1168
+ res << "code->enabled = 1;\n"
1169
+
1103
1170
  # Set the code as inactive. */
1104
1171
  res << " " * (level+1)*3
1105
1172
  res << "code->activated = 0;\n"
@@ -1392,6 +1459,28 @@ module HDLRuby::Low
1392
1459
  end
1393
1460
  end
1394
1461
 
1462
+ ## Extends the TimeTerminate class with generation of C text.
1463
+ class TimeTerminate
1464
+
1465
+ # Generates the C text of the equivalent HDLRuby code.
1466
+ # +level+ is the hierachical level of the object.
1467
+ def to_c(res,level = 0)
1468
+ # Save the value pool state.
1469
+ res << (" " * (level*3)) << "terminate();\n"
1470
+ end
1471
+ end
1472
+
1473
+ ## Extends the Configure class with generation of C text.
1474
+ class Configure
1475
+
1476
+ # Generates the C text of the equivalent HDLRuby code.
1477
+ # +level+ is the hierachical level of the object.
1478
+ def to_c(res,level = 0)
1479
+ # Save the value pool state.
1480
+ res << (" " * (level*3)) << "configure(#{Low2C.obj_name(self.ref.resolve)},#{self.index});\n"
1481
+ end
1482
+ end
1483
+
1395
1484
 
1396
1485
  ## Extends the If class with generation of C text.
1397
1486
  class If
@@ -1993,11 +2082,11 @@ module HDLRuby::Low
1993
2082
  if str =~ /^[01]+$/ && str.length <= 64 then
1994
2083
  # Yes, generate a numeral value.
1995
2084
  res << " " * (level+1)*3
1996
- # res << "static unsigned long long data[] = { "
1997
2085
  res << "static unsigned int data[] = { "
1998
2086
  res << str.scan(/.{1,#{Low2C.int_width}}/m).reverse.map do |sub|
1999
2087
  sub.to_i(2).to_s # + "ULL"
2000
2088
  end.join(",")
2089
+ res << ", 0" if (str.length <= 32)
2001
2090
  res << " };\n"
2002
2091
  # Create the value.
2003
2092
  res << " " * (level+1)*3
@@ -925,6 +925,18 @@ module HDLRuby::Low
925
925
  end.join(" & ") + ";\n"
926
926
  end
927
927
  end
928
+
929
+ ## Extends the TimeTerminate class with generation of HDLRuby::High text.
930
+ class TimeTerminate
931
+
932
+ # Generates the text of the equivalent HDLRuby::High code.
933
+ # +vars+ is the list of the variables and
934
+ # +level+ is the hierachical level of the object.
935
+ def to_vhdl(vars,level = 0)
936
+ # Generate a report statement.
937
+ return " " * (level*3) + "finish;\n"
938
+ end
939
+ end
928
940
 
929
941
  ## Extends the If class with generation of HDLRuby::High text.
930
942
  class If
@@ -75,6 +75,18 @@ module HDLRuby::Low
75
75
  end
76
76
  end
77
77
 
78
+
79
+ ## Extends the TimeTerminate class with functionality for converting booleans
80
+ # in assignments to select operators.
81
+ class TimeTerminate
82
+
83
+ # Converts booleans in assignments to select operators.
84
+ def boolean_in_assign2select!
85
+ # Nothing to do.
86
+ return self
87
+ end
88
+ end
89
+
78
90
 
79
91
  ## Extends the If class with functionality for converting booleans
80
92
  # in assignments to select operators.
@@ -71,7 +71,7 @@ module HDLRuby::Low
71
71
  class Statement
72
72
  # Explicit the types conversions in the statement.
73
73
  def explicit_types!
74
- raise "Should implement explicit_types for class #{self.class}."
74
+ raise "Should implement explicit_types! for class #{self.class}."
75
75
  end
76
76
  end
77
77
 
@@ -98,7 +98,26 @@ module HDLRuby::Low
98
98
  self.map_args!(&:explicit_types)
99
99
  return self
100
100
  end
101
+ end
102
+
103
+
104
+ ## Extends the Configure class with fixing of types and constants.
105
+ class Configure
106
+ # Explicit the types conversions in the statement.
107
+ def explicit_types!
108
+ # Nothing to do.
109
+ return self
110
+ end
111
+ end
101
112
 
113
+
114
+ ## Extends the TimeTerminate class with fixing of types and constants.
115
+ class TimeTerminate
116
+ # Explicit the types conversions in the statement.
117
+ def explicit_types!
118
+ # Nothing to do.
119
+ return self
120
+ end
102
121
  end
103
122
 
104
123
 
@@ -242,7 +242,7 @@ module HDLRuby::Low
242
242
  parent = parent.parent
243
243
  end
244
244
  # Not found.
245
- # puts "Not found!"
245
+ puts "Not found!"
246
246
  return nil
247
247
  end
248
248
  end
@@ -92,6 +92,7 @@ module HDLRuby::Low
92
92
  inputs_blk.add_statement(
93
93
  Transmit.new(right.clone,left.clone))
94
94
  elsif (left_is_o) then
95
+ # puts "left=#{left} right=#{right}"
95
96
  outputs_blk.add_statement(
96
97
  Transmit.new(right.clone,left.clone))
97
98
  elsif (right_is_o) then
@@ -163,7 +163,7 @@ module HDLRuby::Low
163
163
  end
164
164
  end
165
165
 
166
- ## Extends the String class with functionality for converting select
166
+ ## Extends the Print class with functionality for converting select
167
167
  # expressions to case statements.
168
168
  class Print
169
169
  # Extract the Select expressions.
@@ -175,6 +175,16 @@ module HDLRuby::Low
175
175
  return selects
176
176
  end
177
177
  end
178
+
179
+ ## Extends the TimeTerminate class with functionality for converting select
180
+ # expressions to case statements.
181
+ class TimeTerminate
182
+ # Extract the Select expressions.
183
+ def extract_selects!
184
+ # Nothing to extract.
185
+ return []
186
+ end
187
+ end
178
188
 
179
189
  ## Extends the If class with functionality for converting select
180
190
  # expressions to case statements.
@@ -171,7 +171,7 @@ module HDLRuby::Low
171
171
 
172
172
  # Enhance Print with generation of verilog code.
173
173
  class Print
174
- # Converts the system to Verilog code.
174
+ # Converts the print to Verilog code.
175
175
  def to_verilog(spc = 3)
176
176
  code = "#{" " * spc}$write(#{self.each_arg.map do |arg|
177
177
  arg.to_verilog
@@ -180,6 +180,14 @@ module HDLRuby::Low
180
180
  end
181
181
  end
182
182
 
183
+ # Enhance TimeTerminate with generation of verilog code.
184
+ class TimeTerminate
185
+ # Converts the terminate to Verilog code.
186
+ def to_verilog(spc = 3)
187
+ return "#{" " * spc}$finish;"
188
+ end
189
+ end
190
+
183
191
  # To scheduling to the Block.
184
192
  # Enhance Block with generation of verilog code.
185
193
  class Block
@@ -467,7 +467,10 @@ typedef struct SystemIS_ {
467
467
  Object owner; /* The owner if any. */
468
468
 
469
469
  char* name; /* The name of the signal. */
470
- SystemT system; /* The instantiated system. */
470
+ SystemT system; /* The currently instantiated system. */
471
+
472
+ int num_systems; /* The number of systems possibly instantiated here. */
473
+ SystemT* systems; /* The systems possibly instantiated here. */
471
474
  } SystemIS;
472
475
 
473
476
 
@@ -499,6 +502,8 @@ typedef struct BehaviorS_ {
499
502
  Event* events; /* The events of the behavior. */
500
503
  Block block; /* The block of the behavior. */
501
504
 
505
+ int enabled; /* Tells if the behavior is enabled or not. */
506
+
502
507
  int activated; /* Tells if the behavior is activated or not. */
503
508
 
504
509
  int timed; /* Tell if the behavior is timed or not:
@@ -519,6 +524,8 @@ typedef struct CodeS_ {
519
524
  Event* events; /* The events of the behavior. */
520
525
  void (*function)(); /* The function to execute for the code. */
521
526
 
527
+ int enabled; /* Tells if the behavior is enabled or not. */
528
+
522
529
  int activated; /* Tells if the code is activated or not. */
523
530
  } CodeS;
524
531
 
@@ -623,6 +630,16 @@ extern unsigned long long make_delay(int value, Unit unit);
623
630
  * @param func function to applie on each signal. */
624
631
  extern void each_all_signal(void (*func)(SignalI));
625
632
 
633
+
634
+ /** Configure a system instance.
635
+ * @param systemI the system instance to configure.
636
+ * @param idx the index of the target system. */
637
+ extern void configure(SystemI systemI, int idx);
638
+
639
+
640
+ /** Terminates the simulation. */
641
+ extern void terminate();
642
+
626
643
  /* Interface to the visualization engine. */
627
644
 
628
645
  typedef struct {
@@ -701,6 +718,11 @@ extern void init_vcd_visualizer(char* name);
701
718
 
702
719
  /* The interface to the simulator core. */
703
720
 
721
+ /** Sets the enable status of the behaviors of a system type.
722
+ * @param systemT the system type to process.
723
+ * @param status the enable status. */
724
+ extern void set_enable_system(SystemT systemT, int status);
725
+
704
726
  /** The simulation core function.
705
727
  * @param name the name of the simulation.
706
728
  * @param init_vizualizer the vizualizer engine initializer.
@@ -1871,10 +1871,11 @@ static Value equal_value_numeric(Value src0, Value src1, Value dst) {
1871
1871
  dst->type = src0->type;
1872
1872
  dst->numeric = 1;
1873
1873
 
1874
- // /* Perform the !XOR. */
1875
- // dst->data_int = ~(src0->data_int ^ src1->data_int);
1876
1874
  /* Perform the comparison. */
1877
1875
  dst->data_int = (src0->data_int == src1->data_int) ? 1 : 0;
1876
+ printf("scr0->data_int=%lld\n",src0->data_int);
1877
+ printf("scr1->data_int=%lld\n",src1->data_int);
1878
+ printf("dst->data_int=%lld\n",dst->data_int);
1878
1879
  return dst;
1879
1880
  }
1880
1881
 
@@ -253,8 +253,8 @@ void hruby_sim_update_signals() {
253
253
  if (obj->kind == BEHAVIOR) {
254
254
  /* Behavior case. */
255
255
  Behavior beh = (Behavior)obj;
256
- /* Is the code really activated? */
257
- if (beh->activated) {
256
+ /* Is the code really enabled and activated? */
257
+ if (beh->enabled && beh->activated) {
258
258
  /* Yes, execute it. */
259
259
  beh->block->function();
260
260
  /* And deactivate it. */
@@ -264,7 +264,7 @@ void hruby_sim_update_signals() {
264
264
  /* Other code case. */
265
265
  Code cod = (Code)obj;
266
266
  /* Is the code really activated? */
267
- if (cod->activated) {
267
+ if (cod->enabled && cod->activated) {
268
268
  /* Yes, execute it. */
269
269
  cod->function();
270
270
  /* And deactivate it. */
@@ -294,6 +294,35 @@ void hruby_sim_advance_time() {
294
294
  }
295
295
 
296
296
 
297
+ /** Sets the enamble status of the behaviors of a scope.
298
+ * @param scope the scope to process.
299
+ * @param status the enable status. */
300
+ static void set_enable_scope(Scope scope, int status) {
301
+ int i;
302
+ int num_beh = scope->num_behaviors;
303
+ Behavior* behs = scope->behaviors;
304
+ int num_scp = scope->num_scopes;
305
+ Scope* scps = scope->scopes;
306
+
307
+ /* Enable the behaviors. */
308
+ for(i=0; i<num_beh; ++i) {
309
+ behs[i]->enabled = status;
310
+ }
311
+
312
+ /* Recurse on the sub scopes. */
313
+ for(i=0; i<num_scp; ++i) {
314
+ set_enable_scope(scps[i],status);
315
+ }
316
+ }
317
+
318
+ /** Sets the enable status of the behaviors of a system type.
319
+ * @param systemT the system type to process.
320
+ * @param status the enable status. */
321
+ void set_enable_system(SystemT systemT, int status) {
322
+ set_enable_scope(systemT->scope,status);
323
+ }
324
+
325
+
297
326
  /** Activates a behavior.
298
327
  * @param behavior the behavior to activate. */
299
328
  void activate_behavior(Behavior behavior) {
@@ -359,7 +388,8 @@ void* behavior_run(void* arg) {
359
388
  pthread_mutex_unlock(&hruby_sim_mutex);
360
389
  // printf("#2\n");
361
390
  /* Now can start the execution of the behavior. */
362
- behavior->block->function();
391
+ if (behavior->enabled)
392
+ behavior->block->function();
363
393
  // printf("#3\n");
364
394
  /* Now can start the execution of the behavior. */
365
395
  /* Stops the behavior. */
@@ -635,11 +665,35 @@ unsigned long long make_delay(int value, Unit unit) {
635
665
 
636
666
 
637
667
 
638
- /* Iterate over all the signals.
639
- * @param func function to applie on each signal. */
668
+ /** Iterates over all the signals.
669
+ * @param func function to applie on each signal. */
640
670
  void each_all_signal(void (*func)(SignalI)) {
641
671
  int i;
642
672
  for(i = 0; i<num_all_signals; ++i) {
643
673
  func(all_signals[i]);
644
674
  }
645
675
  }
676
+
677
+
678
+ /** Configure a system instance.
679
+ * @param systemI the system instance to configure.
680
+ * @param idx the index of the target system. */
681
+ void configure(SystemI systemI, int idx) {
682
+ int i;
683
+ // printf("Configure to: %i\n",idx);
684
+ /* Sets the current system type. */
685
+ systemI->system = systemI->systems[idx];
686
+ /* Disable all the behaviors of the system instance. */
687
+ for(i=0; i<systemI->num_systems; ++i) {
688
+ if (i != idx)
689
+ set_enable_system(systemI->systems[i],0);
690
+ }
691
+ /* Enable the current system. */
692
+ set_enable_system(systemI->systems[idx],1);
693
+ }
694
+
695
+
696
+ /** Terminates the simulation. */
697
+ void terminate() {
698
+ exit(0);
699
+ }
@@ -85,7 +85,7 @@ static void vcd_print_name(Object object) {
85
85
  vcd_print("%s",name);
86
86
  } else {
87
87
  /* No name, use the address of the object as name generator.*/
88
- vcd_print("$%p",(void*)object);
88
+ vcd_print("x$%p",(void*)object);
89
89
  }
90
90
  break;
91
91
  default: /* Nothing to do */
@@ -0,0 +1,92 @@
1
+ module HDLRuby::High::Std
2
+
3
+ ##
4
+ # Standard HDLRuby::High library: delays
5
+ #
6
+ ########################################################################
7
+
8
+
9
+ ## Module describing a simple delay using handshake for working.
10
+ # @param num the number of clock cycles to delay.
11
+ system :delay do |num|
12
+ # Checks and process the number of clock to wait.
13
+ num = num.to_i
14
+ raise "The delay generic argument must be positive: #{num}" if (num < 0)
15
+
16
+ input :clk # The clock to make the delay on.
17
+ input :req # The handshake request.
18
+ output :ack # The handshake acknoledgment.
19
+
20
+ # The process of the delay.
21
+ if (num == 0) then
22
+ # No delay case.
23
+ ack <= req
24
+ else
25
+ # The is a delay.
26
+ inner run: 0 # Tell if the deayl is running.
27
+ [num.width+1].inner :count # The counter for computing the delay.
28
+ par(clk.posedge) do
29
+ # Is there a request to treat?
30
+ hif(req & ~run) do
31
+ # Yes, intialize the delay.
32
+ run <= 1
33
+ count <= 0
34
+ ack <= 0
35
+ end
36
+ # No, maybe there is a request in processing.
37
+ helsif(run) do
38
+ # Yes, increase the counter.
39
+ count <= count + 1
40
+ # Check if the delay is reached.
41
+ hif(count == num-1) do
42
+ # Yes, tells it and stop the count.
43
+ ack <= 1
44
+ run <= 0
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+
52
+
53
+ ## Module describing a pipeline delay (supporting multiple successive delays)
54
+ # using handshake for working.
55
+ # @param num the number of clock cycles to delay.
56
+ system :delayp do |num|
57
+ # Checks and process the number of clock to wait.
58
+ num = num.to_i
59
+ raise "The delay generic argument must be positive: #{num}" if (num < 0)
60
+
61
+ input :clk # The clock to make the delay on.
62
+ input :req # The handshake request.
63
+ output :ack # The handshake acknoledgment.
64
+
65
+ if (num==0) then
66
+ # No delay.
67
+ ack <= req
68
+ else
69
+ # There is a delay.
70
+
71
+ [num].inner state: 0 # The shift register containing the progression
72
+ # of each requested delay.
73
+
74
+ # The acknoledgment is directly the last bit of the state register.
75
+ ack <= state[-1]
76
+
77
+
78
+ # The process controlling the delay.
79
+ seq(clk.posedge) do
80
+ # Update the state.
81
+ if (num > 1) then
82
+ state <= state << 1
83
+ else
84
+ state <= 0
85
+ end
86
+ # Handle the input.
87
+ ( state[0] <= 1 ).hif(req)
88
+ end
89
+ end
90
+ end
91
+
92
+ end
@@ -0,0 +1,60 @@
1
+ module HDLRuby::High::Std
2
+
3
+ ##
4
+ # Standard HDLRuby::High library: handshake protocols.
5
+ #
6
+ ########################################################################
7
+
8
+
9
+ ## Module describing a simple client handshake for working.
10
+ # @param event the event to synchronize the handshake.
11
+ # @param req the signal telling a request is there.
12
+ # @param cond the condition allowing the protocol.
13
+ system :hs_client do |event, req, cond=_1|
14
+ input :reqI
15
+ output ackI: 0
16
+
17
+ # A each synchronization event.
18
+ par(event) do
19
+ # Is the protocol is allowed and a request is present.
20
+ hif(cond & reqI) do
21
+ # Yes perform the action and tell the request has been treated.
22
+ req <= 1 if req
23
+ ackI <= 1
24
+ end
25
+ helse do
26
+ # No, do not perform the action, and do not acknowledge.
27
+ req <= 0 if req
28
+ ackI <= 0
29
+ end
30
+ end
31
+ end
32
+
33
+
34
+ ## Module describing a simple server handshake for working.
35
+ # @param event the event to synchronize the handshake.
36
+ # @param req the signal for asking a new request.
37
+ system :hs_server do |event, req|
38
+ output reqO: 0
39
+ input :ackO
40
+
41
+ # A each synchronization event.
42
+ par(event) do
43
+ # Shall we start the output?
44
+ hif(ackO) { reqO <= 0 }
45
+ hif(req) { reqO <= 1 }
46
+ end
47
+ end
48
+
49
+
50
+ ## Module describing a pipeline with handshakes.
51
+ # @param event the event to synchronize the handshakes.
52
+ # @param read the signal telling there is a request from the client side
53
+ # @param write the signal used for asking the server to issue a request
54
+ system :hs_pipe do |event,read,write|
55
+ inner :cond
56
+ include(hs_client(event,read,cond))
57
+ include(hs_server(event,write))
58
+ cond <= ~reqO
59
+ end
60
+ end