HDLRuby 2.7.11 → 2.10.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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