HDLRuby 2.11.5 → 2.11.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,6 +35,15 @@ static List touched_signals_seq = &touched_signals_seq_content;
35
35
  static ListS activate_codes_content = { NULL, NULL };
36
36
  static List activate_codes = &activate_codes_content;
37
37
 
38
+
39
+ /** The number of behavior to run for initialization (not the timed ones!). */
40
+ static int num_init_behaviors = 0;
41
+ /** The capacity of teh behavior to run for initialization. */
42
+ static int cap_init_behaviors = 0;
43
+ /** The behaviors to run for initialization (not the timed ones!). */
44
+ static Behavior* init_behaviors = 0;
45
+
46
+
38
47
  /** The number of timed behaviors. */
39
48
  static int num_timed_behaviors = 0;
40
49
  /** The capacity of the timed behaviors. */
@@ -88,12 +97,33 @@ void register_timed_behavior(Behavior behavior) {
88
97
  }
89
98
 
90
99
 
100
+ /** Adds a behavior for initialization (not timed!).
101
+ * @param beh the behavior to register. */
102
+ void register_init_behavior(Behavior beh) {
103
+ if (num_init_behaviors == cap_init_behaviors) {
104
+ if (cap_init_behaviors == 0) {
105
+ /* Need to create the array containing the behaviors. */
106
+ cap_init_behaviors = 100;
107
+ init_behaviors = calloc(cap_init_behaviors,sizeof(Behavior));
108
+ } else {
109
+ /* Need to increase the capacity. */
110
+ Behavior* new_behs = calloc(cap_init_behaviors*2,sizeof(Behavior));
111
+ memcpy(new_behs,init_behaviors,sizeof(Behavior[cap_init_behaviors]));
112
+ cap_init_behaviors *= 2;
113
+ init_behaviors=new_behs;
114
+ }
115
+ }
116
+ /* Add the behavior. */
117
+ init_behaviors[num_init_behaviors++] = beh;
118
+ }
119
+
120
+
91
121
  /** Adds a signal for global processing.
92
122
  * @param signal the signal to register */
93
123
  void register_signal(SignalI signal) {
94
124
  if (num_all_signals == cap_all_signals) {
95
125
  if (cap_all_signals == 0) {
96
- /* Need to create the array containing the timed behaviors. */
126
+ /* Need to create the array containing the signals. */
97
127
  cap_all_signals = 100;
98
128
  all_signals = calloc(cap_all_signals,sizeof(SignalI));
99
129
  } else {
@@ -110,6 +140,24 @@ void register_signal(SignalI signal) {
110
140
  }
111
141
 
112
142
 
143
+
144
+ /** Initial run of the behaviors to init. */
145
+ void run_init_behaviors() {
146
+ int i;
147
+ for(i = 0; i<num_init_behaviors; ++i) {
148
+ Behavior beh = init_behaviors[i];
149
+ #ifdef RCSIM
150
+ // printf("Going to initialize behavior=%p with block=%p\n",beh,beh->block);fflush(stdout);
151
+ execute_statement((Statement)(beh->block),0,beh);
152
+ #else
153
+ beh->block->function();
154
+ #endif
155
+ }
156
+ }
157
+
158
+
159
+
160
+
113
161
  /** Recursively update the signals until no (untimed) behavior are
114
162
  * activated. */
115
163
  void hruby_sim_update_signals() {
@@ -304,6 +352,8 @@ void hruby_sim_advance_time() {
304
352
  if (timed_behaviors[i]->timed == 1)
305
353
  if (beh_time < next_time) next_time = beh_time;
306
354
  }
355
+ /* Mark again all the signals as fading. */
356
+ for(i=0; i<num_all_signals; ++i) all_signals[i]->fading = 1;
307
357
  // printf("hruby_sim_time=%llu next_time=%llu\n",hruby_sim_time,next_time);
308
358
  /* Sets the new activation time. */
309
359
  hruby_sim_time = next_time;
@@ -425,7 +475,6 @@ void* behavior_run(void* arg) {
425
475
 
426
476
  /** Starts a signle timed behavior to run without the multi-threaded engine. */
427
477
  void hruby_sim_start_single_timed_behavior() {
428
- int i;
429
478
  // printf("hruby_sim_start_single_timed_behaviors\n");fflush(stdout);
430
479
  /* Set in mono-thread mode. */
431
480
  sim_single_flag = 1;
@@ -492,11 +541,16 @@ void hruby_sim_core(char* name, void (*init_vizualizer)(char*),
492
541
  if (num_timed_behaviors == 1) {
493
542
  /* Initialize and touch all the signals. */
494
543
  hruby_sim_update_signals();
495
- each_all_signal(&touch_signal);
544
+ // each_all_signal(&touch_signal);
545
+ run_init_behaviors();
496
546
  /* Only one timed behavior, no need of the multi-threaded engine. */
497
547
  hruby_sim_start_single_timed_behavior();
498
548
  } else {
499
549
  /* Use the multi-threaded engine. */
550
+ /* Initialize and touch all the signals. */
551
+ hruby_sim_update_signals();
552
+ // each_all_signal(&touch_signal);
553
+ run_init_behaviors();
500
554
  /* Start all the timed behaviors. */
501
555
  hruby_sim_start_timed_behaviors();
502
556
  // /* Activate the timed behavior that are on time. */
@@ -597,6 +651,7 @@ void touch_signal(SignalI signal) {
597
651
  * @param value the value to transmit
598
652
  * @param signal the signal to transmit the value to. */
599
653
  void transmit_to_signal(Value value, SignalI signal) {
654
+ // printf("Tansmit to signal: %s(%p)\n",signal->name,signal);
600
655
  /* Copy the content. */
601
656
  if (signal->fading)
602
657
  signal->f_value = copy_value(value,signal->f_value);
@@ -718,7 +773,6 @@ unsigned long long make_delay(int value, Unit unit) {
718
773
 
719
774
 
720
775
 
721
-
722
776
  /** Iterates over all the signals.
723
777
  * @param func function to applie on each signal. */
724
778
  void each_all_signal(void (*func)(SignalI)) {
@@ -0,0 +1,65 @@
1
+ #include <stdio.h>
2
+ #include <string.h>
3
+ #include <time.h>
4
+ #include <stdarg.h>
5
+ #include "hruby_sim.h"
6
+
7
+
8
+ /**
9
+ * The HDLRuby simulation mute output engine, to be used with C code
10
+ * generated by the csim engine or by the rcsim engine.
11
+ **/
12
+
13
+ /* Global variables storing the configuration of the vcd generation. */
14
+
15
+
16
+
17
+ /* Low-end print functions. */
18
+
19
+ /** Prints the time.
20
+ * @param time the time to show (given in ps). */
21
+ static void mute_print_time(unsigned long long time) {
22
+ }
23
+
24
+ /** Prints the name of an object without its hierarchy.
25
+ * @param object the object to print the name. */
26
+ static void mute_print_name(Object object) {
27
+ }
28
+
29
+ /** Prints the full name of an object without its hierarchy.
30
+ * @param object the object to print the name. */
31
+ static void mute_print_full_name(Object object) {
32
+ }
33
+
34
+ /** Prints a value.
35
+ * @param value the value to print */
36
+ static void mute_print_value(Value value) {
37
+ }
38
+
39
+ /** Prints a signal with its future value if any.
40
+ * @param signal the signal to show */
41
+ static void mute_print_signal_fvalue(SignalI signal) {
42
+ }
43
+
44
+ /** Prints a signal with its current value if any
45
+ * @param signal the signal to show */
46
+ static void mute_print_signal_cvalue(SignalI signal) {
47
+ }
48
+
49
+
50
+
51
+ /* The configuration and initialization of the vcd vizualizer. */
52
+
53
+
54
+ /** Sets up the mute vizualization engine.
55
+ * @param name the name of the vizualization. */
56
+ extern void init_mute_visualizer(char* name) {
57
+ /* Initialize the vizualizer printer engine. */
58
+ init_visualizer(&mute_print_time,
59
+ &mute_print_full_name,
60
+ &mute_print_value,
61
+ &mute_print_signal_fvalue,
62
+ &default_print_string,
63
+ &default_print_name,
64
+ &default_print_value);
65
+ }
@@ -106,6 +106,16 @@ Value binary(Value (*oper)(Value,Value,Value)) {
106
106
  return oper(l,r,peek());
107
107
  }
108
108
 
109
+ /** Selection calculation.
110
+ * @param num the number of choices to select within. */
111
+ Value hselect(unsigned int num) {
112
+ Value* vals = alloca(num*sizeof(Value));
113
+ int i;
114
+ /* Get the values to concat from the stack. */
115
+ for(i=1;i<=num;++i) vals[num-i] = pop();
116
+ return select_valueP(pop(),peek(),num,vals);
117
+ }
118
+
109
119
  /** Cast calculation.
110
120
  * @param typ the type to cast to.
111
121
  * @return the destination.
@@ -46,11 +46,38 @@ Value calc_expression(Expression expr, Value res) {
46
46
  Value right = get_value();
47
47
  left = calc_expression(bexpr->left,left);
48
48
  right = calc_expression(bexpr->right,right);
49
+ // printf("left=%.*s\n",left->capacity,left->data_str);
50
+ // printf("right=%.*s\n",right->capacity,right->data_str);
49
51
  res = bexpr->oper(left,right,res);
50
52
  free_value();
51
53
  free_value();
52
54
  break;
53
55
  }
56
+ case SELECT:
57
+ {
58
+ Select sexpr = (Select)expr;
59
+ /* Calculate the selection expression. */
60
+ Value selV = get_value();
61
+ selV = calc_expression(sexpr->select,selV);
62
+ /* Is the selection defined? */
63
+ if (is_defined_value(selV)) {
64
+ /* Yes, can perform the selection. */
65
+ long long sel = value2integer(selV);
66
+ if (sel >= 0 && sel < sexpr->num_choices) {
67
+ /* Possible choice, proceed the computation. */
68
+ res = calc_expression(sexpr->choices[sel],res);
69
+ }
70
+ } else {
71
+ /* Cannot compute, simply undefines the destination. */
72
+ /* First ensure res has the right shape. */
73
+ res->type = sexpr->choices[0]->type;
74
+ resize_value(res,type_width(res->type));
75
+ /* Then make it undefined. */
76
+ set_undefined_bitstring(res);
77
+ }
78
+ free_value();
79
+ break;
80
+ }
54
81
  case CONCAT:
55
82
  {
56
83
  Concat cexpr = (Concat)expr;
@@ -70,7 +97,9 @@ Value calc_expression(Expression expr, Value res) {
70
97
  Cast cexpr = (Cast)expr;
71
98
  Value child = get_value();
72
99
  child = calc_expression(cexpr->child,child);
100
+ // printf("going to cast value of numeric=%d and width=%llu to width=%llu\n",child->numeric,type_width(child->type),type_width(cexpr->type));
73
101
  res = cast_value(child,cexpr->type,res);
102
+ // printf("result is numeric=%d\n",res->numeric);
74
103
  free_value();
75
104
  break;
76
105
  }
@@ -157,16 +186,15 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
157
186
  case TRANSMIT:
158
187
  {
159
188
  Transmit trans = (Transmit)stmnt;
160
- // printf("trans=%p trans->left=%p trans->left->kind=%d\n",trans,trans->left,trans->left->kind);
161
189
  /* Compute the right value. */
162
- // Value right = calc_expression(trans->right);
163
190
  Value right = get_value();
164
191
  right = calc_expression(trans->right,right);
192
+ // printf("transmit to left=%p with kind=%d and right=%p with kind=%d\n",trans->left,trans->left->kind,trans->right,trans->right->kind);fflush(stdout);
165
193
  /* Depending on the left value. */
166
194
  switch (trans->left->kind) {
167
195
  case SIGNALI:
168
196
  // printf("left->name=%s\n",((SignalI)(trans->left))->name);
169
- fflush(stdout);
197
+ // fflush(stdout);
170
198
  /* Simple transmission. */
171
199
  if (mode)
172
200
  transmit_to_signal_seq(right,(SignalI)(trans->left));
@@ -178,7 +206,6 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
178
206
  /* Transmission to sub element. */
179
207
  RefIndex refi = (RefIndex)(trans->left);
180
208
  /* Compute the index. */
181
- // Value indexV = calc_expression(refi->index);
182
209
  Value indexV = get_value();
183
210
  indexV = calc_expression(refi->index,indexV);
184
211
  long long index = value2integer(indexV);
@@ -231,8 +258,9 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
231
258
  /* For each sub reference. */
232
259
  for(int i=0; i < refc->num_refs; ++i) {
233
260
  /* Set up the transmit. */
234
- subtrans.left = refc->refs[i];
235
- long long size = type_width(subtrans.left->type);
261
+ subtrans.left = refc->refs[refc->num_refs-i-1];
262
+ unsigned long long size = type_width(subtrans.left->type);
263
+ // printf("i=%i left=%p left->type=%p &left->type=%p right->kind=%i pos=%llu size=%llu\n",i,subtrans.left,subtrans.left->type,&(subtrans.left->type),right->kind,pos,size,size);fflush(stdout);
236
264
  subtrans.right = (Expression)get_value();
237
265
  subtrans.right = (Expression)read_range(
238
266
  right,pos,pos+size-1,
@@ -244,6 +272,7 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
244
272
  free_value();
245
273
  pos += size;
246
274
  }
275
+ break;
247
276
  }
248
277
  default:
249
278
  perror("Invalid kind for a reference.");
@@ -279,7 +308,6 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
279
308
  {
280
309
  HIf hif = (HIf)stmnt;
281
310
  /* Calculation the condition. */
282
- // Value condition = calc_expression(hif->condition);
283
311
  Value condition = get_value();
284
312
  condition = calc_expression(hif->condition,condition);
285
313
  /* Is it true? */
@@ -290,7 +318,6 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
290
318
  /* No, maybe an alternate condition is met. */
291
319
  int met = 0;/* Tell if an alternate condition has been met.*/
292
320
  for(int i=0; i<hif->num_noifs; ++i) {
293
- // Value subcond = calc_expression(hif->noconds[i]);
294
321
  Value subcond = get_value();
295
322
  subcond = calc_expression(hif->noconds[i],subcond);
296
323
  if (is_defined_value(subcond) && value2integer(subcond)){
@@ -305,7 +332,7 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
305
332
  free_value();
306
333
  }
307
334
  /* Where there a sub condition met? */
308
- if (!met) {
335
+ if (!met && hif->no) {
309
336
  /* No, execute the no statement. */
310
337
  execute_statement(hif->no,mode,behavior);
311
338
  }
@@ -7,7 +7,7 @@
7
7
 
8
8
  /**
9
9
  * The HDLRuby simulation vcd format genertion engine, to be used with C code
10
- * generated by hruby_low2c.
10
+ * generated by the csim engine or by the rcsim engine.
11
11
  **/
12
12
 
13
13
  /* Global variables storing the configuration of the vcd generation. */
@@ -74,20 +74,24 @@ static void vcd_print_name(Object object) {
74
74
  case SCOPE:
75
75
  case SYSTEMI:
76
76
  case BLOCK:
77
- /* Print the name if name. */
78
- /* Trick: SystemT, SignalI, Scope and SystemI have the
79
- * field name at the same place. */
80
- if ((((Block)object)->name != NULL) &&
81
- strlen(((Block)object)->name)>0) {
82
- char name[256];
83
- strncpy(name,((Block)object)->name,256);
84
- replace_char(name,':','$');
85
- vcd_print("%s",name);
86
- } else {
87
- /* No name, use the address of the object as name generator.*/
88
- vcd_print("x$%p",(void*)object);
77
+ {
78
+ /* Print the name if name. */
79
+ /* Trick: SystemT, Block, Scope and SystemI have the
80
+ * field name at the same place. */
81
+ char* namep = object->kind == SIGNALI ?
82
+ ((SignalI)object)->name : ((Block)object)->name;
83
+ if (namep!=NULL &&
84
+ strlen(namep)>0) {
85
+ char name[256];
86
+ strncpy(name,namep,256);
87
+ replace_char(name,':','$');
88
+ vcd_print("%s",name);
89
+ } else {
90
+ /* No name, use the address of the object as name generator.*/
91
+ vcd_print("x$%p",(void*)object);
92
+ }
93
+ break;
89
94
  }
90
- break;
91
95
  default: /* Nothing to do */
92
96
  break;
93
97
  }
@@ -0,0 +1,92 @@
1
+
2
+ # A benchmark for the arithmetic operations.
3
+ system :arith_bench do
4
+ signed[8].inner :x8,:y8,:z8,:s8
5
+ signed[10].inner :s10
6
+ signed[16].inner :x16,:y16,:z16,:s16
7
+ signed[18].inner :s18
8
+ signed[32].inner :x32,:y32,:z32,:s32
9
+ signed[34].inner :s34
10
+
11
+ s8 <= x8+y8+z8
12
+ s10 <= x8.as(signed[10])+y8+z8
13
+
14
+ s16 <= x16+y16+z16
15
+ s18 <= x16.as(signed[18])+y16+z16
16
+
17
+ s32 <= x32+y32+z32
18
+ s34 <= x32.as(signed[34])+y32+z32
19
+
20
+ timed do
21
+ x8 <= 0
22
+ y8 <= 0
23
+ z8 <= 0
24
+ x16 <= 0
25
+ y16 <= 0
26
+ z16 <= 0
27
+ x32 <= 0
28
+ y32 <= 0
29
+ z32 <= 0
30
+ !10.ns
31
+ x8 <= 1
32
+ y8 <= 1
33
+ z8 <= 1
34
+ x16 <= 1
35
+ y16 <= 1
36
+ z16 <= 1
37
+ x32 <= 1
38
+ y32 <= 1
39
+ z32 <= 1
40
+ !10.ns
41
+ x8 <= 2
42
+ y8 <= 2
43
+ z8 <= 2
44
+ x16 <= 4
45
+ y16 <= 4
46
+ z16 <= 4
47
+ x32 <= 8
48
+ y32 <= 8
49
+ z32 <= 8
50
+ !10.ns
51
+ x8 <= 0x7F
52
+ y8 <= 0x7F
53
+ z8 <= 0x7F
54
+ x16 <= 0x7FFF
55
+ y16 <= 0x7FFF
56
+ z16 <= 0x7FFF
57
+ x32 <= 0x7FFFFFFF
58
+ y32 <= 0x7FFFFFFF
59
+ z32 <= 0x7FFFFFFF
60
+ !10.ns
61
+ x8 <= -1
62
+ y8 <= -1
63
+ z8 <= -1
64
+ x16 <= -1
65
+ y16 <= -1
66
+ z16 <= -1
67
+ x32 <= -1
68
+ y32 <= -1
69
+ z32 <= -1
70
+ !10.ns
71
+ x8 <= -2
72
+ y8 <= -2
73
+ z8 <= -2
74
+ x16 <= -4
75
+ y16 <= -4
76
+ z16 <= -4
77
+ x32 <= -8
78
+ y32 <= -8
79
+ z32 <= -8
80
+ !10.ns
81
+ x8 <= -0x80
82
+ y8 <= -0x80
83
+ z8 <= -0x80
84
+ x16 <= -0x8000
85
+ y16 <= -0x8000
86
+ z16 <= -0x8000
87
+ x32 <= -0x80000000
88
+ y32 <= -0x80000000
89
+ z32 <= -0x80000000
90
+ !10.ns
91
+ end
92
+ end
@@ -0,0 +1,58 @@
1
+ # A simple counter
2
+ system :counter do
3
+ input :clk, :rst
4
+ [8].input :inc
5
+ [8].output :count
6
+
7
+ par(clk.posedge) do
8
+ hif(rst) { count <= 0 }
9
+ helse { count <= count + inc }
10
+ end
11
+ end
12
+
13
+ # A benchmark for the counter using a constant as the inc input.
14
+ system :dff_bench do
15
+ inner :clk, :rst
16
+ [8].inner :count
17
+ [8].constant inc: 5
18
+
19
+ # counter(:my_counter).(clk,rst,inc,count)
20
+ counter(:my_counter).(clk,rst,5,count)
21
+
22
+ # par do
23
+ # my_counter.inc <= 5
24
+ # count <= my_counter.count
25
+ # end
26
+
27
+ timed do
28
+ clk <= 0
29
+ rst <= 0
30
+ !10.ns
31
+ clk <= 1
32
+ rst <= 0
33
+ !10.ns
34
+ clk <= 0
35
+ rst <= 1
36
+ !10.ns
37
+ clk <= 1
38
+ rst <= 1
39
+ !10.ns
40
+ clk <= 0
41
+ rst <= 0
42
+ !10.ns
43
+ clk <= 1
44
+ !10.ns
45
+ clk <= 0
46
+ !10.ns
47
+ clk <= 1
48
+ !10.ns
49
+ clk <= 0
50
+ !10.ns
51
+ clk <= 1
52
+ !10.ns
53
+ clk <= 0
54
+ !10.ns
55
+ clk <= 1
56
+ !10.ns
57
+ end
58
+ end
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -380,6 +380,9 @@ $optparse = OptionParser.new do |opts|
380
380
  $options[:rcsim] = v
381
381
  $options[:multiple] = v
382
382
  end
383
+ opts.on("--mute", "The simulator will not generate any output") do |v|
384
+ $options[:mute] = v
385
+ end
383
386
  opts.on("--vcd", "The simulator will generate a vcd file") do |v|
384
387
  $options[:vcd] = v
385
388
  end
@@ -712,8 +715,9 @@ elsif $options[:clang] then
712
715
  $main = File.open($name,"w")
713
716
 
714
717
  # Select the vizualizer depending on the options.
715
- init_visualizer = $options[:vcd] ? "init_vcd_visualizer" :
716
- "init_default_visualizer"
718
+ init_visualizer = $options[:mute] ? "init_mute_visualizer" :
719
+ $options[:vcd] ? "init_vcd_visualizer" :
720
+ "init_default_visualizer"
717
721
 
718
722
  # Gather the system to generate and sort them in the right order
719
723
  # to ensure references are generated before being used.
@@ -857,9 +861,13 @@ elsif $options[:rsim] then
857
861
  HDLRuby.show "#{Time.now}#{show_mem}"
858
862
  # Ruby-level simulation.
859
863
  require 'HDLRuby/hruby_rsim.rb'
860
- # Is VCD output is required.
861
- if $options[:vcd] then
862
- # Yes
864
+ # Is mute or VCD output is required.
865
+ if $options[:mute] then
866
+ # Yes for mute.
867
+ require "HDLRuby/hruby_rsim_mute.rb"
868
+ $top_system.sim($stdout)
869
+ elsif $options[:vcd] then
870
+ # Yes for VCD
863
871
  require "HDLRuby/hruby_rsim_vcd.rb"
864
872
  vcdout = File.open($output+"/hruby_simulator.vcd","w")
865
873
  $top_system.sim(vcdout)
@@ -881,7 +889,8 @@ elsif $options[:rcsim] then
881
889
  $top_system.to_rcsim
882
890
  HDLRuby.show "Executing the hybrid C-Ruby-level simulator..."
883
891
  HDLRuby.show "#{Time.now}#{show_mem}"
884
- HDLRuby::High.rcsim($top_system,"hruby_simulator",$output,$options[:vcd] && true)
892
+ HDLRuby::High.rcsim($top_system,"hruby_simulator",$output,
893
+ ($options[:mute] && 1) || ($options[:vcd] && 2) || 0)
885
894
  HDLRuby.show "End of hybrid C-Ruby-level simulation..."
886
895
  HDLRuby.show "#{Time.now}#{show_mem}"
887
896
  elsif $options[:vhdl] then
@@ -51,7 +51,9 @@ module HDLRuby
51
51
  elsif val.is_a?(Numeric) then
52
52
  # Content is a numeric.
53
53
  @content = []
54
- if val > 0 then
54
+ if val == 0 then
55
+ @content << 0
56
+ elsif val > 0 then
55
57
  while val > 0 do
56
58
  @content << (val & 1)
57
59
  val /= 2
@@ -110,6 +112,11 @@ module HDLRuby
110
112
  return @content
111
113
  end
112
114
 
115
+ # Hash comparison.
116
+ def eql?(bstr)
117
+ return @content.eql?(bstr.raw_content)
118
+ end
119
+
113
120
  # Tells if the bit string is strictly.
114
121
  #
115
122
  # NOTE: return false if the sign is undefined of if it is unknown
@@ -180,10 +187,14 @@ module HDLRuby
180
187
  if right >= left then
181
188
  # puts "left=#{left} right=#{right}"
182
189
  # Get the corresponding bits as a BitString
183
- return BitString.new(@content[left..right],:raw)
190
+ # return BitString.new(@content[left..right],:raw)
191
+ # set to positive.
192
+ return BitString.new(@content[left..right]+[0],:raw)
184
193
  else
185
194
  # Get the corresponding bits as a BitString
186
- return BitString.new(@content[right..left].reverse,:raw)
195
+ # return BitString.new(@content[right..left].reverse,:raw)
196
+ # set to positive.
197
+ return BitString.new(@content[right..left].reverse+[0],:raw)
187
198
  end
188
199
  else
189
200
  # Process the index.
@@ -532,6 +543,7 @@ module HDLRuby
532
543
  val = BitString.new(val)
533
544
  end
534
545
  vcontent = val.raw_content
546
+ # puts "vcontent=#{vcontent}"
535
547
  width = vcontent.size > @content.size ? vcontent.size : @content.size
536
548
  res_content = width.times.map do |i|
537
549
  # Get the bits to compute with
@@ -4213,7 +4213,7 @@ module HDLRuby::High
4213
4213
  # Creates a new +type+ sort of block with possible +name+
4214
4214
  # and build it by executing +ruby_block+.
4215
4215
  def initialize(type, name = :"", &ruby_block)
4216
- # Initialize the block.
4216
+ # Initialize the behavior.
4217
4217
  super(type,name)
4218
4218
 
4219
4219
  unless name.empty? then
@@ -4674,7 +4674,11 @@ module HDLRuby::High
4674
4674
  class ::Integer
4675
4675
  # Converts to a new high-level expression.
4676
4676
  def to_expr
4677
- return Value.new(Integer,self)
4677
+ if (self.bit_length <= 63) then
4678
+ return Value.new(Integer,self)
4679
+ else
4680
+ return Value.new(TypeSigned.new(:"",self.bit_length..0),self)
4681
+ end
4678
4682
  end
4679
4683
  end
4680
4684
 
@@ -5168,9 +5172,9 @@ module HDLRuby::High
5168
5172
 
5169
5173
 
5170
5174
  # Standard vector types.
5171
- Integer = TypeSigned.new(:integer)
5175
+ Integer = TypeSigned.new(:integer,63..0)
5172
5176
  Char = TypeSigned.new(:char,7..0)
5173
- Natural = TypeUnsigned.new(:natural)
5177
+ Natural = TypeUnsigned.new(:natural,63..0)
5174
5178
  Bignum = TypeSigned.new(:bignum,HDLRuby::Infinity..0)
5175
5179
  Real = TypeFloat.new(:float)
5176
5180