HDLRuby 2.4.1 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65ef28718e6de9e9d1358073d2d7ae8bd914a3f942b48d6cd45c8f28f545a906
4
- data.tar.gz: 0d469d886d79f65ebfc69a4c4f95d2d8f50c0ada6f4fdbf0349d3c9650fa4581
3
+ metadata.gz: 9c3f6418748c0552d8c5d8544ae64ebdc287646b95ffec70d50c66d131529a6a
4
+ data.tar.gz: c2c55a5b9defc62bbb387072dd318918f9dc802065eb764303cacac3cfbf5f91
5
5
  SHA512:
6
- metadata.gz: 4d458fe640fd29e1e31470b1f395333c3fd344703903c0c7d126e780d9e6f93c419f18a4e4cbaadc91461d19ed0087388a249fe3ccd87b2ed29d731733ecbc5b
7
- data.tar.gz: 1ff098b2ca9bff7758bff7a5bb5e20df7272f53f103944037f9575b55444e6179781129e5d87e301a4e29b885bee5cc82794918ad85ac8236894603759d66212
6
+ metadata.gz: 619d787d2f4f621591f37b06d4cf048c39a1a652a810835b18aa12610c69a17d2587a06fee10a3f2ff4406b744b567d2aed5d2dc21b2a5201676057c58a24b26
7
+ data.tar.gz: a5d2677dd07c54224dfb189d28c5c82015c4b099b7b204049402d1df940ac19e9051f9e199e56e6f2d043134697b307873b53e80dc86728bca2ebdc1087ce39f
@@ -0,0 +1,14 @@
1
+
2
+ # A benchmark for the bit string generation in case of signed values.
3
+ system :bstr_bench do
4
+ signed[7..0].inner :val
5
+
6
+ timed do
7
+ val <= 0
8
+ !10.ns
9
+ val <= 26
10
+ !10.ns
11
+ val <= -25
12
+ !10.ns
13
+ end
14
+ end
@@ -174,13 +174,22 @@ channel(:handshake) do |typ|
174
174
  end
175
175
 
176
176
 
177
- $mode = :prodcons
178
177
  # $mode = :sync
179
178
  # $mode = :nsync
180
179
  # $mode = :async
180
+ # $mode = :proco # Producter / Consummer
181
181
  # $channel = :register
182
182
  # $channel = :handshake
183
- $channel = :queue
183
+ # $channel = :queue
184
+
185
+ # The configuration scenarii
186
+ $scenarii = [ [:sync, :register], [:sync, :handshake], [:sync, :queue],
187
+ [:nsync, :register], [:nsync, :handshake], [:nsync, :queue],
188
+ [:async, :register], [:async, :handshake], [:async, :queue],
189
+ [:proco, :register], [:proco, :handshake], [:proco, :queue] ]
190
+
191
+ # The configuration
192
+ $mode, $channel = $scenarii[11]
184
193
 
185
194
  # Testing the queue channel.
186
195
  system :test_queue do
@@ -199,7 +208,7 @@ system :test_queue do
199
208
  ev = $mode == :sync ? clk.posedge :
200
209
  $mode == :nsync ? clk.negedge : clk2.posedge
201
210
 
202
- if $mode != :prodcons then
211
+ if $mode != :proco then
203
212
  # Sync/Neg sync and async tests mode
204
213
  par(ev) do
205
214
  hif(rst) do
@@ -263,27 +272,28 @@ system :test_queue do
263
272
  rst <= 1
264
273
  !3.ns
265
274
  clk2 <= 1
266
- !1.ns
267
- clk3 <= 1
268
- !6.ns
275
+ !3.ns
276
+ clk3 <= 0
277
+ !4.ns
269
278
  clk <= 1
270
279
  !10.ns
271
280
  clk <= 0
272
- rst <= 0
273
281
  !3.ns
274
282
  clk2 <= 0
275
- !1.ns
283
+ !3.ns
276
284
  clk3 <= 1
277
- !6.ns
285
+ !2.ns
286
+ rst <= 0
287
+ !2.ns
278
288
  64.times do
279
289
  clk <= 1
280
290
  !10.ns
281
291
  clk <= 0
282
292
  !3.ns
283
293
  clk2 <= ~clk2
284
- !1.ns
294
+ !3.ns
285
295
  hif (clk2 == 0) { clk3 <= ~ clk3 }
286
- !6.ns
296
+ !4.ns
287
297
  end
288
298
  end
289
299
  end
@@ -35,10 +35,13 @@ module HDLRuby
35
35
  # Maybe str is an numeric.
36
36
  if str.is_a?(Numeric) then
37
37
  # Yes, convert it to a binary string.
38
- str = str.to_s(2)
38
+ num = str
39
+ str = num.to_s(2)
39
40
  # And fix the sign.
40
41
  if str[0] == "-" then
41
- str = str[1..-1]
42
+ # str = str[1..-1]
43
+ str = (2**str.size+num).to_s(2)
44
+ puts "str=#{str}"
42
45
  sign = "-"
43
46
  else
44
47
  sign = "+"
@@ -111,6 +111,8 @@ module HDLRuby::Low
111
111
  res << "int main(int argc, char* argv[]) {\n"
112
112
  # Build the objects.
113
113
  objs.each { |obj| res << " #{Low2C.make_name(obj)}();\n" }
114
+ # Sets the top systemT.
115
+ res << " top_system = #{Low2C.obj_name(top)};\n"
114
116
  # Starts the simulation.
115
117
  res<< " hruby_sim_core(\"#{name}\",#{init_visualizer},-1);\n"
116
118
  # Close the main.
@@ -1329,6 +1331,10 @@ module HDLRuby::Low
1329
1331
  res << "block->owner = NULL;\n"
1330
1332
  end
1331
1333
 
1334
+ # The name
1335
+ res << " " * (level+1)*3
1336
+ res << "block->name = \"#{self.name}\";\n"
1337
+
1332
1338
  # Add the inner signals declaration.
1333
1339
  res << " " * (level+1)*3
1334
1340
  res << "block->num_inners = #{self.each_inner.to_a.size};\n"
@@ -1439,8 +1445,14 @@ module HDLRuby::Low
1439
1445
  str = self.content.is_a?(BitString) ?
1440
1446
  self.content.to_s : self.content.to_s(2).rjust(32,"0")
1441
1447
  else
1442
- sign = self.content>=0 ? "0" : "1"
1443
- str = self.content.abs.to_s(2).rjust(width,sign).upcase
1448
+ # sign = self.content>=0 ? "0" : "1"
1449
+ # str = self.content.abs.to_s(2).rjust(width,sign).upcase
1450
+ if self.content >= 0 then
1451
+ str = self.content.to_s(2).rjust(width,"0").upcase
1452
+ else
1453
+ str = (2**width+self.content).to_s(2).upcase
1454
+ end
1455
+ # puts "content=#{self.content} str=#{str}"
1444
1456
  end
1445
1457
  # Is it a fully defined number?
1446
1458
  if str =~ /^[01]+$/ then
@@ -474,6 +474,7 @@ typedef struct BlockS_ {
474
474
  Kind kind; /* The kind of object. */
475
475
  Object owner; /* The owner if any. */
476
476
 
477
+ char* name; /* The name of the block. */
477
478
  int num_inners; /* The number of inners. */
478
479
  SignalI* inners; /* The inners of the scope. */
479
480
  void (*function)(); /* The function to execute for the block. */
@@ -496,6 +497,9 @@ typedef struct EventS_ {
496
497
  /* The time units. */
497
498
  typedef enum { S, MS, US, NS, PS, FS } Unit;
498
499
 
500
+ /** The top system. */
501
+ extern SystemT top_system;
502
+
499
503
  /** Adds a timed behavior for processing.
500
504
  * @param behavior the timed behavior to register */
501
505
  extern void register_timed_behavior(Behavior behavior);
@@ -574,17 +578,17 @@ typedef struct {
574
578
  void (*print_signal)(SignalI);
575
579
  } PrinterS;
576
580
 
577
- PrinterS printer;
581
+ extern PrinterS printer;
578
582
 
579
583
  /** Initializes the visualization printer engine.
580
584
  * @param print_time the time printer
581
585
  * @param print_name the name printer
582
586
  * @param print_value the value printer
583
587
  * @param print_signal the signal state printer. */
584
- void init_visualizer(void (*print_time)(unsigned long long),
585
- void (*print_name)(Object),
586
- void (*print_value)(Value),
587
- void (*print_signal)(SignalI));
588
+ extern void init_visualizer(void (*print_time)(unsigned long long),
589
+ void (*print_name)(Object),
590
+ void (*print_value)(Value),
591
+ void (*print_signal)(SignalI));
588
592
 
589
593
  // /** Prints the time.
590
594
  // * @param time the time to show. */
@@ -12,6 +12,9 @@
12
12
  * hruby_low2c.
13
13
  * */
14
14
 
15
+ /** The top system. */
16
+ SystemT top_system;
17
+
15
18
  /** The number of all the signals. */
16
19
  static int num_all_signals = 0;
17
20
  /** The capacity of the set of signals. */
@@ -64,35 +64,49 @@ static void vcd_print_time(unsigned long long time) {
64
64
  }
65
65
 
66
66
 
67
- /** Prints the name of an object.
67
+ /** Prints the name of an object without its hierarchy.
68
68
  * @param object the object to print the name. */
69
69
  static void vcd_print_name(Object object) {
70
- /* Recurse on the owner if any. */
71
- // printf("owner=%p\n",object->owner);
72
- if (object->owner != NULL) {
73
- vcd_print_name(object->owner);
74
- vcd_print("$");
75
- }
76
70
  /* Depending on the kind of object. */
77
71
  switch(object->kind) {
78
72
  case SYSTEMT:
79
73
  case SIGNALI:
80
74
  case SCOPE:
81
75
  case SYSTEMI:
76
+ case BLOCK:
82
77
  /* Print the name if name. */
83
78
  /* Trick: SystemT, SignalI, Scope and SystemI have the
84
79
  * field name at the same place. */
85
- if (((SystemI)object)->name != NULL) {
80
+ if ((((Block)object)->name != NULL) &&
81
+ strlen(((Block)object)->name)>0) {
86
82
  char name[256];
87
- strncpy(name,((SystemI)object)->name,256);
83
+ strncpy(name,((Block)object)->name,256);
88
84
  replace_char(name,':','$');
89
85
  vcd_print("%s",name);
86
+ } else {
87
+ /* No name, use the address of the object as name generator.*/
88
+ vcd_print("$%p",(void*)object);
90
89
  }
90
+ break;
91
91
  default: /* Nothing to do */
92
92
  break;
93
93
  }
94
94
  }
95
95
 
96
+
97
+ /** Prints the name of an object incluing its heirarchy.
98
+ * @param object the object to print the name. */
99
+ static void vcd_print_full_name(Object object) {
100
+ /* Recurse on the owner if any. */
101
+ // printf("owner=%p\n",object->owner);
102
+ if (object->owner != NULL) {
103
+ vcd_print_full_name(object->owner);
104
+ vcd_print("$");
105
+ }
106
+ /* Print the name of the object. */
107
+ vcd_print_name(object);
108
+ }
109
+
96
110
  /** Prints a value.
97
111
  * @param value the value to print */
98
112
  static void vcd_print_value(Value value) {
@@ -127,23 +141,169 @@ static void vcd_print_value(Value value) {
127
141
  * @param signal the signal to declare */
128
142
  static void vcd_print_var(SignalI signal) {
129
143
  vcd_print("$var wire %d ",type_width(signal->type));
130
- vcd_print_name((Object)signal);
144
+ vcd_print_full_name((Object)signal);
131
145
  vcd_print(" ");
132
146
  vcd_print_name((Object)signal);
133
147
  vcd_print(" $end\n");
134
148
  }
135
149
 
136
150
 
137
- /** Prints a signal.
151
+ /** Prints a signal with its future value if any.
138
152
  * @param signal the signal to show */
139
- static void vcd_print_signal(SignalI signal) {
140
- vcd_print_value(signal->f_value);
141
- vcd_print(" ");
142
- vcd_print_name((Object)signal);
143
- vcd_print("\n");
153
+ static void vcd_print_signal_fvalue(SignalI signal) {
154
+ if (signal->f_value) {
155
+ vcd_print_value(signal->f_value);
156
+ vcd_print(" ");
157
+ vcd_print_full_name((Object)signal);
158
+ vcd_print("\n");
159
+ }
160
+ }
161
+
162
+
163
+ /** Prints a signal with its current value if any
164
+ * @param signal the signal to show */
165
+ static void vcd_print_signal_cvalue(SignalI signal) {
166
+ if (signal->c_value) {
167
+ vcd_print_value(signal->c_value);
168
+ vcd_print(" ");
169
+ vcd_print_full_name((Object)signal);
170
+ vcd_print("\n");
171
+ }
172
+ }
173
+
174
+
175
+ /** Prints the hierarchy content of a system type.
176
+ * @param system the system to print. */
177
+ static void vcd_print_systemT_content(SystemT system);
178
+
179
+ /** Prints the hierarchy of a scope.
180
+ * @param scope the scope to print. */
181
+ static void vcd_print_scope(Scope scope);
182
+
183
+
184
+ /** Prints the hierarchy of a block.
185
+ * @param block the block to print. */
186
+ static void vcd_print_block(Block block) {
187
+ int i;
188
+ /* Do not print block with no declaration. */
189
+ if (block->num_inners == 0) return;
190
+
191
+ /* Declares the block if named. */
192
+ vcd_print("$scope module ");
193
+ vcd_print_name((Object)block);
194
+ vcd_print(" $end\n");
195
+
196
+ /* Declare the inners of the systems. */
197
+ for(i=0; i<block->num_inners; ++i) {
198
+ vcd_print_var(block->inners[i]);
199
+ }
200
+
201
+ /* Close the hierarchy. */
202
+ vcd_print("$upscope $end\n");
144
203
  }
145
204
 
146
205
 
206
+ /** Prints the hierarchy of a system instances.
207
+ * @param scope the scope to print. */
208
+ static void vcd_print_systemI(SystemI systemI) {
209
+ /* Declares the systemI. */
210
+ vcd_print("$scope module ");
211
+ vcd_print_name((Object)systemI);
212
+ vcd_print(" $end\n");
213
+
214
+ /* Declares its content. */
215
+ vcd_print_systemT_content(systemI->system);
216
+
217
+ /* Close the hierarchy. */
218
+ vcd_print("$upscope $end\n");
219
+ }
220
+
221
+
222
+ /** Prints the hierarchy inside a scope.
223
+ * @param scope the scope to print the inside. */
224
+ static void vcd_print_scope_content(Scope scope) {
225
+ int i;
226
+
227
+ /* Declare the inners of the systems. */
228
+ for(i=0; i<scope->num_inners; ++i) {
229
+ vcd_print_var(scope->inners[i]);
230
+ }
231
+
232
+ /* Recurse on the system instances. */
233
+ for(i=0; i<scope->num_systemIs; ++i) {
234
+ vcd_print_systemI(scope->systemIs[i]);
235
+ }
236
+
237
+ /* Recurse on the sub scopes. */
238
+ for(i=0; i<scope->num_scopes; ++i) {
239
+ vcd_print_scope(scope->scopes[i]);
240
+ }
241
+
242
+ /* Recurse on the behaviors. */
243
+ for(i=0; i<scope->num_behaviors; ++i) {
244
+ vcd_print_block(scope->behaviors[i]->block);
245
+ }
246
+ }
247
+
248
+
249
+ /** Prints the hierarchy of a scope.
250
+ * @param scope the scope to print. */
251
+ static void vcd_print_scope(Scope scope) {
252
+ /* Do not print block with no declaration. */
253
+ if (scope->num_inners == 0 && scope->num_scopes == 0 && scope->num_behaviors == 0) return;
254
+ /* Declares the scope. */
255
+ vcd_print("$scope module ");
256
+ vcd_print_name((Object)scope);
257
+ vcd_print(" $end\n");
258
+
259
+ /* Declares its content. */
260
+ vcd_print_scope_content(scope);
261
+
262
+ /* Close the hierarchy. */
263
+ vcd_print("$upscope $end\n");
264
+ }
265
+
266
+
267
+ /** Prints the hierarchy content of a system type.
268
+ * @param system the system to print. */
269
+ static void vcd_print_systemT_content(SystemT system) {
270
+ int i;
271
+
272
+ /* Declare the inputs of the systems. */
273
+ for(i = 0; i<system->num_inputs; ++i) {
274
+ vcd_print_var(system->inputs[i]);
275
+ }
276
+ /* Declare the outputs of the systems. */
277
+ for(i = 0; i<system->num_outputs; ++i) {
278
+ vcd_print_var(system->outputs[i]);
279
+ }
280
+ /* Declare the inouts of the systems. */
281
+ for(i = 0; i<system->num_inouts; ++i) {
282
+ vcd_print_var(system->inouts[i]);
283
+ }
284
+ /* Recurse on the content of the scope (the scope header is the system).*/
285
+ vcd_print_scope_content(system->scope);
286
+ }
287
+
288
+
289
+ /** Prints the hierarchy of a system type.
290
+ * @param system the system to print. */
291
+ static void vcd_print_systemT(SystemT system) {
292
+ int i;
293
+ /* Declares the module. */
294
+ vcd_print("$scope module ");
295
+ vcd_print_name((Object)system);
296
+ vcd_print(" $end\n");
297
+
298
+ /* Declares the content. */
299
+ vcd_print_systemT_content(system);
300
+
301
+ /* Close the hierarchy. */
302
+ vcd_print("$upscope $end\n");
303
+ }
304
+
305
+
306
+
147
307
 
148
308
 
149
309
  /* high-end print functions. */
@@ -164,7 +324,7 @@ static void vcd_print_header() {
164
324
  /* The version section. */
165
325
  vcd_print("$version\n");
166
326
  vcd_print(" Generated from HDLRuby simulator\n");
167
- vcd_print("$end");
327
+ vcd_print("$end\n");
168
328
 
169
329
  /* The comment section. */
170
330
  vcd_print("$comment\n");
@@ -174,20 +334,25 @@ static void vcd_print_header() {
174
334
  /* The time scale section: for now 1ps only. */
175
335
  vcd_print("$timescale 1ps $end\n");
176
336
 
177
- /* The scope section: nothing specific. */
178
- vcd_print("$scope module logic $end\n");
337
+ // /* The scope section: nothing specific. */
338
+ // vcd_print("$scope module logic $end\n");
179
339
 
180
- /* The variables declaration. */
181
- each_all_signal(&vcd_print_var);
340
+ // /* The variables declaration. */
341
+ // each_all_signal(&vcd_print_var);
182
342
 
343
+ // /* Ends the declarations. */
344
+ // vcd_print("$upscope $end\n");
345
+ // vcd_print("$enddefinitions $end\n");
346
+
347
+ /* The declaration of the hierarchy and the variables
348
+ * from the top system. */
349
+ vcd_print_systemT(top_system);
183
350
  /* Ends the declarations. */
184
- vcd_print("$upscope $end\n");
185
351
  vcd_print("$enddefinitions $end\n");
186
352
 
187
353
  /* Display the initializations. */
188
354
  vcd_print("$dumpvars\n");
189
- // Maybe nothing to do.
190
- // each_all_init_signal(&vcd_print_signal);
355
+ each_all_signal(&vcd_print_signal_cvalue);
191
356
  vcd_print("$end\n");
192
357
  }
193
358
 
@@ -206,9 +371,9 @@ extern void init_vcd_visualizer(char* name) {
206
371
 
207
372
  /* Initialize the vizualizer printer engine. */
208
373
  init_visualizer(&vcd_print_time,
209
- &vcd_print_name,
374
+ &vcd_print_full_name,
210
375
  &vcd_print_value,
211
- &vcd_print_signal);
376
+ &vcd_print_signal_fvalue);
212
377
 
213
378
  /* Prints the header of the vcd file. */
214
379
  vcd_print_header();
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.4.1"
2
+ VERSION = "2.4.6"
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.4.1
4
+ version: 2.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-24 00:00:00.000000000 Z
11
+ date: 2020-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -75,6 +75,7 @@ files:
75
75
  - lib/HDLRuby/hdr_samples/addsub.rb
76
76
  - lib/HDLRuby/hdr_samples/addsubz.rb
77
77
  - lib/HDLRuby/hdr_samples/alu.rb
78
+ - lib/HDLRuby/hdr_samples/bstr_bench.rb
78
79
  - lib/HDLRuby/hdr_samples/calculator.rb
79
80
  - lib/HDLRuby/hdr_samples/counter_bench.rb
80
81
  - lib/HDLRuby/hdr_samples/dff.rb