HDLRuby 3.1.0 → 3.2.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.
- checksums.yaml +4 -4
- data/HDLRuby.gemspec +1 -0
- data/README.md +10 -0
- data/ext/hruby_sim/hruby_rcsim_build.c +2 -0
- data/ext/hruby_sim/hruby_sim_calc.c +33 -6
- data/ext/hruby_sim/hruby_sim_tree_calc.c +111 -22
- data/lib/HDLRuby/hdr_samples/comparison_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +8 -7
- data/lib/HDLRuby/hdr_samples/dff_properties.rb +2 -0
- data/lib/HDLRuby/hdr_samples/enum_as_param.rb +52 -0
- data/lib/HDLRuby/hdr_samples/linear_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +6 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +6 -6
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +6 -6
- data/lib/HDLRuby/hdr_samples/memory_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +9 -5
- data/lib/HDLRuby/hdr_samples/ram.rb +7 -6
- data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +2 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +15 -3
- data/lib/HDLRuby/hdr_samples/with_bram.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_channel.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +3 -1
- data/lib/HDLRuby/hdr_samples/with_connector.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +6 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint_adv.rb +73 -0
- data/lib/HDLRuby/hdr_samples/with_leftright.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_sequencer.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_channel.rb +58 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +10 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +18 -4
- data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +2 -1
- data/lib/HDLRuby/hdrcc.rb +12 -0
- data/lib/HDLRuby/hruby_high.rb +82 -26
- data/lib/HDLRuby/hruby_low.rb +127 -3
- data/lib/HDLRuby/hruby_low2programs.rb +47 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +3 -2
- data/lib/HDLRuby/hruby_low_without_namespace.rb +133 -5
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +1 -1
- data/lib/HDLRuby/hruby_rcsim.rb +24 -1
- data/lib/HDLRuby/hruby_serializer.rb +2 -1
- data/lib/HDLRuby/hruby_verilog.rb +94 -20
- data/lib/HDLRuby/hruby_verilog_name.rb +3 -17
- data/lib/HDLRuby/std/fixpoint.rb +2 -2
- data/lib/HDLRuby/std/function_generator.rb +1 -1
- data/lib/HDLRuby/std/linear.rb +7 -7
- data/lib/HDLRuby/std/sequencer.rb +263 -13
- data/lib/HDLRuby/std/sequencer_channel.rb +90 -0
- data/lib/HDLRuby/std/sequencer_func.rb +28 -15
- data/lib/HDLRuby/std/std.rb +1 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +22 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bc9fecc1e612564d0a491efb3b33d88897b35dc6d40fc8a67da4c55212fececd
|
|
4
|
+
data.tar.gz: 8fc2490cf24c3b1343ea8bdfe0ae6dcfa56ce6e055661a19b7bed2b0929ec432
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 33448731ae5e188eefdca0cb18205abb31eedf26b0a84d9a48c4f873bbf2a978831f47f172453a726555c0845145938082dbb9e32e75da64fbe71279a5cac665
|
|
7
|
+
data.tar.gz: 7e75b9e351501e1ae8d2ca81e5e9f442ac3d29f400b49c9813bf6cddff409e24fd57ea72773287163f7d11b1226736c35de2f44fa14f5028f8480cd94661661f
|
data/HDLRuby.gemspec
CHANGED
|
@@ -33,5 +33,6 @@ Gem::Specification.new do |spec|
|
|
|
33
33
|
# spec.add_development_dependency "rake", "~> 10.0"
|
|
34
34
|
spec.add_development_dependency "bundler", ">= 2.0.1"
|
|
35
35
|
spec.add_development_dependency "rake", ">= 10.0"
|
|
36
|
+
spec.add_development_dependency "rake-compiler", ">= 1.0"
|
|
36
37
|
# spec.add_development_dependency "minitest", "~> 5.0"
|
|
37
38
|
end
|
data/README.md
CHANGED
|
@@ -11,6 +11,16 @@ If you are new to HDLRuby, it is recommended that you consult first the followin
|
|
|
11
11
|
|
|
12
12
|
__What's new__
|
|
13
13
|
|
|
14
|
+
For HDLRuby version 3.2.0:
|
|
15
|
+
|
|
16
|
+
* Added component for declaring BRAM and BRAM-based stacks.
|
|
17
|
+
The goal is to efficiently allocate memories inside FPGAs.
|
|
18
|
+
|
|
19
|
+
* Inner code overhaul for preparing version 4.0.0
|
|
20
|
+
|
|
21
|
+
* Multiple bug fixes
|
|
22
|
+
|
|
23
|
+
|
|
14
24
|
For HDLRuby version 3.1.0:
|
|
15
25
|
|
|
16
26
|
* [Functions for sequencers](#sequencer-specific-function-std-sequencer_func-rb) supporting recursion;
|
|
@@ -1443,6 +1443,8 @@ void Init_hruby_sim() {
|
|
|
1443
1443
|
|
|
1444
1444
|
/* Create the class that wraps C pointers. */
|
|
1445
1445
|
RCSimPointer = rb_define_class("RCSimPointer",rb_cObject);
|
|
1446
|
+
/* No allocator for C pointers. */
|
|
1447
|
+
rb_undef_alloc_func(RCSimPointer);
|
|
1446
1448
|
|
|
1447
1449
|
/* Add the interface methods. */
|
|
1448
1450
|
/* Getting the C simulation type objects. */
|
|
@@ -50,6 +50,12 @@
|
|
|
50
50
|
// ({ __typeof__ (v) _v = (v); \
|
|
51
51
|
// _v->type->flags.sign ? (_v->data[_v->size-1] >> (INT_BIT-1)) ? UINT_MAX : 0 : 0; })
|
|
52
52
|
|
|
53
|
+
/** Fix the sign of a numeric value. */
|
|
54
|
+
#define fix_numeric_sign(v) \
|
|
55
|
+
({if ((v)->type->flags.sign && (type_width((v)->type) < 64) && ((v)->data_int & (1ULL << (type_width((v)->type)-1)))) {\
|
|
56
|
+
(v)->data_int |= (-1LL) << type_width((v)->type);\
|
|
57
|
+
}})
|
|
58
|
+
|
|
53
59
|
/* The type engine: each type is simplified to a vector of X elements
|
|
54
60
|
* of Y bits. */
|
|
55
61
|
|
|
@@ -900,6 +906,7 @@ static Value greater_equal_value_defined_bitstring(Value src0, Value src1, Value
|
|
|
900
906
|
/* Converts the values to integers. */
|
|
901
907
|
unsigned long long src0i = value2integer(src0);
|
|
902
908
|
unsigned long long src1i = value2integer(src1);
|
|
909
|
+
// printf("src0i=%lld src1i=%lld, src0i.sign=%d src0i.width=%d, src1i.sign=%d src1i.width=%d\n",src0i,src1i,src0->type->flags.sign,type_width(src0->type),src1->type->flags.sign,type_width(src1->type));
|
|
903
910
|
/* Perform the comparison. */
|
|
904
911
|
if (src0->type->flags.sign) {
|
|
905
912
|
if (src1->type->flags.sign)
|
|
@@ -1275,7 +1282,7 @@ static Value shift_left_value_bitstring_numeric(Value src0, Value src1, Value ds
|
|
|
1275
1282
|
char d0 = src0_data[count];
|
|
1276
1283
|
/* Set it to the destination at the right place. */
|
|
1277
1284
|
unsigned long long pos = count + sh;
|
|
1278
|
-
if ((pos
|
|
1285
|
+
if ((pos>=0) && (pos<width0)) {
|
|
1279
1286
|
dst_data[pos] = d0;
|
|
1280
1287
|
}
|
|
1281
1288
|
}
|
|
@@ -1290,6 +1297,7 @@ static Value shift_left_value_bitstring_numeric(Value src0, Value src1, Value ds
|
|
|
1290
1297
|
* @param dst the destination
|
|
1291
1298
|
* @return dst */
|
|
1292
1299
|
static Value shift_right_value_bitstring_numeric(Value src0, Value src1, Value dst) {
|
|
1300
|
+
// printf("shift_right_value_bitstring_numeric with src0=%s src1=%lld\n",src0->data_str,src1->data_int);
|
|
1293
1301
|
unsigned long long count;
|
|
1294
1302
|
/* Get the widths of the first source. */
|
|
1295
1303
|
unsigned long long width0 = type_width(src0->type);
|
|
@@ -1319,10 +1327,11 @@ static Value shift_right_value_bitstring_numeric(Value src0, Value src1, Value d
|
|
|
1319
1327
|
char d0 = src0_data[count];
|
|
1320
1328
|
/* Set it to the destination at the right place. */
|
|
1321
1329
|
unsigned long long pos = count + sh;
|
|
1322
|
-
if ((pos
|
|
1330
|
+
if ((pos>=0) && (pos<width0)) {
|
|
1323
1331
|
dst_data[pos] = d0;
|
|
1324
1332
|
}
|
|
1325
1333
|
}
|
|
1334
|
+
// printf("result=%s\n",dst_data);
|
|
1326
1335
|
/* Return the destination value. */
|
|
1327
1336
|
return dst;
|
|
1328
1337
|
}
|
|
@@ -1683,6 +1692,7 @@ Value read_range_bitstring(Value src,
|
|
|
1683
1692
|
unsigned long long first, unsigned long long last,
|
|
1684
1693
|
Type base, Value dst) {
|
|
1685
1694
|
// printf("read_range_bitstring with first=%lld last=%lld src=%s\n",first,last,src->data_str);
|
|
1695
|
+
// printf("read_range_bitstring with first=%lld last=%lld\n",first,last);
|
|
1686
1696
|
/* Ensure first is the smaller. */
|
|
1687
1697
|
if (first > last) {
|
|
1688
1698
|
long long tmp = last;
|
|
@@ -1705,6 +1715,7 @@ Value read_range_bitstring(Value src,
|
|
|
1705
1715
|
|
|
1706
1716
|
/* Performs the read. */
|
|
1707
1717
|
memcpy(dst->data_str,src->data_str + first, length);
|
|
1718
|
+
// printf("result: %s\n",dst->data_str);
|
|
1708
1719
|
|
|
1709
1720
|
/* Return the destination. */
|
|
1710
1721
|
return dst;
|
|
@@ -1888,9 +1899,15 @@ static Value mul_value_numeric(Value src0, Value src1, Value dst) {
|
|
|
1888
1899
|
/* Sets state of the destination using the first source. */
|
|
1889
1900
|
dst->type = src0->type;
|
|
1890
1901
|
dst->numeric = 1;
|
|
1902
|
+
/* Fix the numeric signs since multiply is sensitive to it. */
|
|
1903
|
+
// printf("src0 type_width=%d src1 type_width=%d (%d)\n",type_width(src0->type),type_width(src1->type),src1->type->flags.sign);
|
|
1904
|
+
fix_numeric_sign(src0);
|
|
1905
|
+
fix_numeric_sign(src1);
|
|
1906
|
+
// printf("Then src0->data_int=%llx src1->data_int=%llx\n",src0->data_int,src1->data_int);
|
|
1891
1907
|
|
|
1892
1908
|
/* Perform the multiplication. */
|
|
1893
1909
|
dst->data_int = fix_numeric_type(dst->type, src0->data_int * src1->data_int);
|
|
1910
|
+
// printf("result=%llx\n",dst->data_int);
|
|
1894
1911
|
return dst;
|
|
1895
1912
|
}
|
|
1896
1913
|
|
|
@@ -1905,6 +1922,10 @@ static Value div_value_numeric(Value src0, Value src1, Value dst) {
|
|
|
1905
1922
|
dst->type = src0->type;
|
|
1906
1923
|
dst->numeric = 1;
|
|
1907
1924
|
|
|
1925
|
+
/* Fix the numeric signs since multiply is sensitive to it. */
|
|
1926
|
+
fix_numeric_sign(src0);
|
|
1927
|
+
fix_numeric_sign(src1);
|
|
1928
|
+
|
|
1908
1929
|
/* Perform the division. */
|
|
1909
1930
|
dst->data_int = fix_numeric_type(dst->type, src0->data_int / src1->data_int);
|
|
1910
1931
|
return dst;
|
|
@@ -3347,13 +3368,20 @@ RefRangeS make_ref_rangeS(SignalI signal, Type typ,
|
|
|
3347
3368
|
* @param value the value to convert
|
|
3348
3369
|
* @return the resulting int. */
|
|
3349
3370
|
unsigned long long value2integer(Value value) {
|
|
3371
|
+
// printf("value2integer\n");
|
|
3350
3372
|
unsigned long long width = type_width(value->type);
|
|
3351
|
-
/* If the value is numeric,
|
|
3373
|
+
/* If the value is numeric, return it with its sign propoerly extended*/
|
|
3352
3374
|
if (value->numeric) {
|
|
3353
3375
|
// printf("width=%llu\n",width);
|
|
3354
3376
|
if (width == 64)
|
|
3377
|
+
/* Nothing to do. */
|
|
3355
3378
|
return value->data_int;
|
|
3379
|
+
else if (value->type->flags.sign &&
|
|
3380
|
+
((value->data_int >> (width-1))&1))
|
|
3381
|
+
/* Sign extension. */
|
|
3382
|
+
return value->data_int | (0xFFFFFFFFFFFFFFFFULL << width);
|
|
3356
3383
|
else
|
|
3384
|
+
/* Zero extension. */
|
|
3357
3385
|
return value->data_int & ~(0xFFFFFFFFFFFFFFFFULL << width);
|
|
3358
3386
|
}
|
|
3359
3387
|
/* Otherwise convert the bitstring to an integer if possible,
|
|
@@ -3377,11 +3405,10 @@ unsigned long long value2integer(Value value) {
|
|
|
3377
3405
|
res = (res << 1) | bit;
|
|
3378
3406
|
}
|
|
3379
3407
|
// printf("first res=%llx\n",res);
|
|
3380
|
-
unsigned long long bit0 = (data_str[width-1]-'0') << i;
|
|
3381
3408
|
/* Perform the sign extension if required. */
|
|
3382
|
-
if (
|
|
3409
|
+
if (value->type->flags.sign) {
|
|
3410
|
+
unsigned long long bit0 = (data_str[width-1]-'0') << i;
|
|
3383
3411
|
for(; i<LONG_LONG_BIT; ++i) {
|
|
3384
|
-
// res = (res << 1) | bit;
|
|
3385
3412
|
res |= bit0;
|
|
3386
3413
|
bit0 <<= 1;
|
|
3387
3414
|
}
|
|
@@ -121,6 +121,9 @@ Value calc_expression(Expression expr, Value res) {
|
|
|
121
121
|
free_value();
|
|
122
122
|
/* Performs the access. */
|
|
123
123
|
res = read_range(value,index,index,rexpr->type,res);
|
|
124
|
+
/* Set the type to the one of the reference since it is
|
|
125
|
+
* an index access and not a range one. */
|
|
126
|
+
res->type = rexpr->type;
|
|
124
127
|
free_value();
|
|
125
128
|
break;
|
|
126
129
|
}
|
|
@@ -174,6 +177,82 @@ Value calc_expression(Expression expr, Value res) {
|
|
|
174
177
|
}
|
|
175
178
|
|
|
176
179
|
|
|
180
|
+
/** Calculates a range access from a reference.
|
|
181
|
+
* Recurse over the multiple references.
|
|
182
|
+
* @param ref the reference to work on.
|
|
183
|
+
* @param first the first index of the access.
|
|
184
|
+
* @param last the last index of the access.
|
|
185
|
+
* @param sig the target signal. */
|
|
186
|
+
void calc_ref_rangeS(Reference ref, long long* first, long long *last,
|
|
187
|
+
SignalI* sig) {
|
|
188
|
+
// printf("calc_ref_rangeS with kind=%d\n",ref->kind);
|
|
189
|
+
if (ref->kind == CAST) {
|
|
190
|
+
/* Create a new reference for the computation that changes the type. */
|
|
191
|
+
Cast refc = (Cast)ref;
|
|
192
|
+
/* Compute the range for the child. */
|
|
193
|
+
long long cfirst, clast;
|
|
194
|
+
calc_ref_rangeS(refc->child,&cfirst,&clast,sig);
|
|
195
|
+
/* Update first and last using the cast. */
|
|
196
|
+
/* Both first and last should be equal since the type of the cast sets
|
|
197
|
+
* the width */
|
|
198
|
+
// printf("cfirst=%d clast=%d\n",cfirst,clast);
|
|
199
|
+
*first = *last = cfirst;
|
|
200
|
+
}
|
|
201
|
+
else if (ref->kind == REF_INDEX) {
|
|
202
|
+
RefIndex refi = (RefIndex)ref;
|
|
203
|
+
/* Compute the index of refi. */
|
|
204
|
+
Value indexV = get_value();
|
|
205
|
+
indexV = calc_expression(refi->index,indexV);
|
|
206
|
+
long long index = value2integer(indexV);
|
|
207
|
+
// printf("index=%d\n",index);
|
|
208
|
+
free_value();
|
|
209
|
+
/* Is the reference a signal? */
|
|
210
|
+
if (refi->ref->kind == SIGNALI) {
|
|
211
|
+
/* Yes, end here. */
|
|
212
|
+
*first = index;
|
|
213
|
+
*last = index;
|
|
214
|
+
*sig = (SignalI)(refi->ref);
|
|
215
|
+
} else {
|
|
216
|
+
/* No, need to recurse. */
|
|
217
|
+
long long pfirst, plast;
|
|
218
|
+
calc_ref_rangeS(refi->ref,&pfirst,&plast,sig);
|
|
219
|
+
// printf("pfirst=%d plast=%d\n",pfirst,plast);
|
|
220
|
+
/* Calculate the final first and last. */
|
|
221
|
+
*first = *last = pfirst + index;
|
|
222
|
+
}
|
|
223
|
+
} else if (ref->kind == REF_RANGE) {
|
|
224
|
+
RefRangeE refr = (RefRangeE)ref;
|
|
225
|
+
/* Compute the range of refr */
|
|
226
|
+
Value firstV = get_value();
|
|
227
|
+
firstV = calc_expression(refr->first,firstV);
|
|
228
|
+
long long firstR = value2integer(firstV);
|
|
229
|
+
free_value();
|
|
230
|
+
Value lastV = get_value();
|
|
231
|
+
lastV = calc_expression(refr->last,lastV);
|
|
232
|
+
long long lastR = value2integer(lastV);
|
|
233
|
+
free_value();
|
|
234
|
+
// printf("firstR=%d lastR=%d\n",firstR,lastR);
|
|
235
|
+
/* Is the reference a signal? */
|
|
236
|
+
if (refr->ref->kind == SIGNALI) {
|
|
237
|
+
/* Yes, end here. */
|
|
238
|
+
*first = firstR;
|
|
239
|
+
*last = lastR;
|
|
240
|
+
*sig = (SignalI)(refr->ref);
|
|
241
|
+
} else {
|
|
242
|
+
/* No, need to recurse. */
|
|
243
|
+
long long pfirst, plast;
|
|
244
|
+
calc_ref_rangeS(refr->ref,&pfirst,&plast,sig);
|
|
245
|
+
/* Calculate the final first and last. */
|
|
246
|
+
*first = pfirst + firstR;
|
|
247
|
+
*last = plast + lastR;
|
|
248
|
+
}
|
|
249
|
+
} else {
|
|
250
|
+
perror("Invalid reference for converting to range access.");
|
|
251
|
+
exit(1);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
|
|
177
256
|
|
|
178
257
|
/** Executes a statement.
|
|
179
258
|
* @param stmnt the statement to execute.
|
|
@@ -205,15 +284,22 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
|
|
|
205
284
|
{
|
|
206
285
|
/* Transmission to sub element. */
|
|
207
286
|
RefIndex refi = (RefIndex)(trans->left);
|
|
208
|
-
/* Compute the index. */
|
|
209
|
-
Value indexV = get_value();
|
|
210
|
-
indexV = calc_expression(refi->index,indexV);
|
|
211
|
-
long long index = value2integer(indexV);
|
|
212
|
-
free_value();
|
|
213
|
-
/* Generate the reference inside the left value. */
|
|
287
|
+
// /* Compute the index. */
|
|
288
|
+
// Value indexV = get_value();
|
|
289
|
+
// indexV = calc_expression(refi->index,indexV);
|
|
290
|
+
// long long index = value2integer(indexV);
|
|
291
|
+
// free_value();
|
|
292
|
+
// /* Generate the reference inside the left value. */
|
|
293
|
+
// RefRangeS ref =
|
|
294
|
+
// make_ref_rangeS((SignalI)(refi->ref),refi->type,
|
|
295
|
+
// index,index);
|
|
296
|
+
/* Compute the range. */
|
|
297
|
+
long long first,last;
|
|
298
|
+
SignalI sig;
|
|
299
|
+
calc_ref_rangeS((Reference)refi,&first,&last,&sig);
|
|
300
|
+
/* Now can create the range. */
|
|
214
301
|
RefRangeS ref =
|
|
215
|
-
make_ref_rangeS(
|
|
216
|
-
index,index);
|
|
302
|
+
make_ref_rangeS(sig,refi->type,first,last);
|
|
217
303
|
/* Perform the transmit. */
|
|
218
304
|
if(mode)
|
|
219
305
|
transmit_to_signal_range_seq(right,ref);
|
|
@@ -226,21 +312,24 @@ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
|
|
|
226
312
|
/* Transmission to range of sub elements. */
|
|
227
313
|
RefRangeE refr = (RefRangeE)(trans->left);
|
|
228
314
|
/* Compute the range. */
|
|
229
|
-
// Value firstV =
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
315
|
+
// Value firstV = get_value();
|
|
316
|
+
// firstV = calc_expression(refr->first,firstV);
|
|
317
|
+
// long long first = value2integer(firstV);
|
|
318
|
+
// free_value();
|
|
319
|
+
// Value lastV = get_value();
|
|
320
|
+
// lastV = calc_expression(refr->last,lastV);
|
|
321
|
+
// long long last = value2integer(lastV);
|
|
322
|
+
// free_value();
|
|
323
|
+
// /* Generate the reference inside the left value. */
|
|
324
|
+
// RefRangeS ref =
|
|
325
|
+
// make_ref_rangeS((SignalI)(refr->ref),refr->type,
|
|
326
|
+
// first,last);
|
|
327
|
+
long long first,last;
|
|
328
|
+
SignalI sig;
|
|
329
|
+
calc_ref_rangeS((Reference)refr,&first,&last,&sig);
|
|
330
|
+
/* Now can create the range. */
|
|
241
331
|
RefRangeS ref =
|
|
242
|
-
make_ref_rangeS(
|
|
243
|
-
first,last);
|
|
332
|
+
make_ref_rangeS(sig,refr->type,first,last);
|
|
244
333
|
/* Perform the transmit. */
|
|
245
334
|
if(mode)
|
|
246
335
|
transmit_to_signal_range_seq(right,ref);
|
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
# A simple D-FF
|
|
2
2
|
system :dff do
|
|
3
|
-
input :clk, :d
|
|
3
|
+
input :clk, :rst, :d
|
|
4
4
|
output :q
|
|
5
5
|
|
|
6
|
-
(q <= d).at(clk.posedge)
|
|
6
|
+
(q <= d & ~rst).at(clk.posedge)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
# A benchmark for the dff.
|
|
10
10
|
system :dff_bench do
|
|
11
|
-
inner :clk
|
|
11
|
+
inner :clk, :rst
|
|
12
12
|
inner :d0, :q0, :d1, :q1
|
|
13
13
|
|
|
14
|
-
dff(:my_dff0).(clk,d0,q0)
|
|
15
|
-
dff(:my_dff1).(d0,d1,q1)
|
|
14
|
+
dff(:my_dff0).(clk,rst,d0,q0)
|
|
15
|
+
dff(:my_dff1).(d0,rst,d1,q1)
|
|
16
16
|
|
|
17
17
|
d0 <= ~q0
|
|
18
18
|
d1 <= ~q1
|
|
19
19
|
|
|
20
20
|
timed do
|
|
21
|
-
d0 <= 0
|
|
22
|
-
d1 <= 0
|
|
23
21
|
clk <= 0
|
|
22
|
+
rst <= 0
|
|
24
23
|
!10.ns
|
|
25
24
|
clk <= 1
|
|
26
25
|
!10.ns
|
|
27
26
|
clk <= 0
|
|
27
|
+
rst <= 1
|
|
28
28
|
!10.ns
|
|
29
29
|
clk <= 1
|
|
30
30
|
!10.ns
|
|
31
31
|
clk <= 0
|
|
32
|
+
rst <= 0
|
|
32
33
|
!10.ns
|
|
33
34
|
clk <= 1
|
|
34
35
|
!10.ns
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Check if an enum can be passed as generic parameter.
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
system :machin do |vals|
|
|
5
|
+
input :clk,:rst
|
|
6
|
+
[8].output :res
|
|
7
|
+
sequencer(clk,rst) do
|
|
8
|
+
vals.seach { |val| res <= val }
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
system :truc do |sig|
|
|
13
|
+
[8].output :res
|
|
14
|
+
|
|
15
|
+
res <= sig
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
system :machin_bench do
|
|
19
|
+
inner :clk,:rst
|
|
20
|
+
|
|
21
|
+
bit[8][-4].inner vals: [ _h01,_h02,_h03,_h05 ]
|
|
22
|
+
[8].inner :res0
|
|
23
|
+
|
|
24
|
+
machin(vals).(:my_machin).(clk,rst,res0)
|
|
25
|
+
|
|
26
|
+
[8].inner :val, :res1
|
|
27
|
+
truc(val).(:my_truc).(res1)
|
|
28
|
+
|
|
29
|
+
timed do
|
|
30
|
+
val <= 10
|
|
31
|
+
clk <= 0
|
|
32
|
+
rst <= 0
|
|
33
|
+
!10.ns
|
|
34
|
+
clk <= 1
|
|
35
|
+
rst <= 0
|
|
36
|
+
!10.ns
|
|
37
|
+
clk <= 0
|
|
38
|
+
rst <= 1
|
|
39
|
+
!10.ns
|
|
40
|
+
clk <= 1
|
|
41
|
+
!10.ns
|
|
42
|
+
clk <= 0
|
|
43
|
+
rst <= 0
|
|
44
|
+
!10.ns
|
|
45
|
+
repeat(15) do
|
|
46
|
+
clk <= 1
|
|
47
|
+
!10.ns
|
|
48
|
+
clk <= 0
|
|
49
|
+
!10.ns
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
system :logic_bench do
|
|
4
4
|
[3].inner :x,:y
|
|
5
5
|
[3].inner :s_not, :s_and, :s_or, :s_xor, :s_nxor
|
|
6
|
+
|
|
7
|
+
signed[16].inner :a,:b,:shl,:shr
|
|
6
8
|
|
|
7
9
|
timed do
|
|
8
10
|
8.times do |i|
|
|
@@ -15,6 +17,10 @@ system :logic_bench do
|
|
|
15
17
|
s_xor <= x ^ y
|
|
16
18
|
s_nxor <= (x == y)
|
|
17
19
|
!10.ns
|
|
20
|
+
a <= i
|
|
21
|
+
b <= j
|
|
22
|
+
shl <= (a << b)
|
|
23
|
+
shr <= (a >> b)
|
|
18
24
|
end
|
|
19
25
|
end
|
|
20
26
|
end
|
|
@@ -54,7 +54,7 @@ system :mei8 do |prog_file = "./prog.obj"|
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
# The control part for choosing between 0, add, sub and neg.
|
|
57
|
-
par do
|
|
57
|
+
par(opr,x,y) do
|
|
58
58
|
# Default computations
|
|
59
59
|
cf <= 0; vf <= 0; zf <= (z == 0); sf <= z[7]
|
|
60
60
|
add.(0,0,0)
|
|
@@ -148,14 +148,14 @@ system :mei8 do |prog_file = "./prog.obj"|
|
|
|
148
148
|
end
|
|
149
149
|
end
|
|
150
150
|
|
|
151
|
+
# Handling of the 3-state data bus
|
|
152
|
+
dbus <= mux(io_rwb,io_out,_bzzzzzzzz)
|
|
153
|
+
io_in <= dbus
|
|
154
|
+
|
|
151
155
|
# The io unit.
|
|
152
156
|
fsm(clk.posedge,rst,:async) do
|
|
153
157
|
default { io_done <= 0; req <= 0; rwb <= 0; addr <= 0
|
|
154
|
-
io_r_done <= 0
|
|
155
|
-
# Default handling of the 3-state data bus
|
|
156
|
-
hif(io_rwb) { dbus <= _zzzzzzzz }
|
|
157
|
-
helse { dbus <= io_out }
|
|
158
|
-
io_in <= dbus }
|
|
158
|
+
io_r_done <= 0 }
|
|
159
159
|
reset(:sync) { data <= 0; }
|
|
160
160
|
state(:wait) { goto(io_req,:start,:wait) } # Waiting for an IO
|
|
161
161
|
state(:start) { req <= 1; rwb <= io_rwb; addr <= g # Start an IO
|
|
@@ -56,7 +56,7 @@ system :mei8 do |prog_file = "./prog.obj"|
|
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
# The control part for choosing between 0, add, sub and neg.
|
|
59
|
-
par do
|
|
59
|
+
par(opr,x,y) do
|
|
60
60
|
# Default computations
|
|
61
61
|
cf <= 0; vf <= 0; zf <= (z == 0); sf <= z[7]
|
|
62
62
|
add.(0,0,0)
|
|
@@ -150,14 +150,14 @@ system :mei8 do |prog_file = "./prog.obj"|
|
|
|
150
150
|
end
|
|
151
151
|
end
|
|
152
152
|
|
|
153
|
+
# Handling of the 3-state data bus
|
|
154
|
+
dbus <= mux(io_rwb,io_out,_bzzzzzzzz)
|
|
155
|
+
io_in <= dbus
|
|
156
|
+
|
|
153
157
|
# The io unit.
|
|
154
158
|
fsm(clk.posedge,rst,:async) do
|
|
155
159
|
default { io_done <= 0; req <= 0; rwb <= 0; addr <= 0
|
|
156
|
-
io_r_done <= 0
|
|
157
|
-
# Default handling of the 3-state data bus
|
|
158
|
-
hif(io_rwb) { dbus <= _zzzzzzzz }
|
|
159
|
-
helse { dbus <= io_out }
|
|
160
|
-
io_in <= dbus }
|
|
160
|
+
io_r_done <= 0 }
|
|
161
161
|
reset(:sync) { data <= 0; }
|
|
162
162
|
state(:wait) { goto(io_req,:start,:wait) } # Waiting for an IO
|
|
163
163
|
state(:start) { req <= 1; rwb <= io_rwb; addr <= g # Start an IO
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
# A simple circuit with named sub
|
|
7
|
-
system :named_sub do
|
|
8
|
-
input :
|
|
9
|
-
output :s
|
|
7
|
+
system :named_sub do |x|
|
|
8
|
+
input :y
|
|
9
|
+
output :s, :z
|
|
10
10
|
|
|
11
11
|
sub :somesub do
|
|
12
12
|
inner :sig
|
|
@@ -17,13 +17,17 @@ system :named_sub do
|
|
|
17
17
|
s <= ~somesub.sig
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
z <= s
|
|
21
|
+
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
# A benchmark for the circuit.
|
|
23
25
|
system :named_sub_bench do
|
|
24
|
-
inner :x, :y, :s
|
|
26
|
+
inner :x, :y, :s, :z
|
|
27
|
+
|
|
28
|
+
named_sub(x).(:my_named_sub).(y,s)
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
z <= my_named_sub.z
|
|
27
31
|
|
|
28
32
|
timed do
|
|
29
33
|
x <= 0
|
|
@@ -4,15 +4,16 @@ system :ram8_16 do
|
|
|
4
4
|
[7..0].input :addr
|
|
5
5
|
[7..0].inout :data
|
|
6
6
|
|
|
7
|
+
[7..0].inner :data_in
|
|
8
|
+
|
|
7
9
|
bit[7..0][2**8].inner :content
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
data <= mux(en & rwb, _bzzzzzzzz, content[addr])
|
|
12
|
+
data_in <= data
|
|
13
|
+
|
|
10
14
|
par(clk.posedge) do
|
|
11
|
-
hif(en) do
|
|
12
|
-
|
|
13
|
-
hif(rwb) { data <= content[addr] }
|
|
14
|
-
helse { content[addr] <= data }
|
|
15
|
+
hif(en & ~rwb) do
|
|
16
|
+
content[addr] <= data_in
|
|
15
17
|
end
|
|
16
|
-
helse { data <= _bZZZZZZZZ }
|
|
17
18
|
end
|
|
18
19
|
end
|
|
@@ -8,6 +8,8 @@ system :my_system do
|
|
|
8
8
|
inner :z
|
|
9
9
|
{ sub0: bit, sub1: bit[2]}.inner :sigA
|
|
10
10
|
some_struct.inner :sigB, :sigC
|
|
11
|
+
# { sub4: bit[8], sub5: bit[8] }.to_type[-2].inner :sigs
|
|
12
|
+
{ sub4: bit[8][-2], sub5: bit[8][-2] }.inner :sigs
|
|
11
13
|
|
|
12
14
|
sigC <= sigA
|
|
13
15
|
|
|
@@ -15,9 +17,19 @@ system :my_system do
|
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
timed do
|
|
18
|
-
z <= 0
|
|
19
|
-
x <= 1
|
|
20
|
-
y <= _b000
|
|
20
|
+
# z <= 0
|
|
21
|
+
# x <= 1
|
|
22
|
+
# y <= _b000
|
|
23
|
+
|
|
24
|
+
# sigs[0].sub4 <= 1
|
|
25
|
+
# sigs[0].sub5 <= 2
|
|
26
|
+
# sigs[1].sub4 <= 3
|
|
27
|
+
# sigs[1].sub5 <= 4
|
|
28
|
+
sigs.sub4[0] <= 1
|
|
29
|
+
sigs.sub5[0] <= 2
|
|
30
|
+
sigs.sub4[1] <= 3
|
|
31
|
+
sigs.sub5[1] <= 4
|
|
32
|
+
|
|
21
33
|
!10.ns
|
|
22
34
|
sigA.sub0 <= 0
|
|
23
35
|
sigA.sub1 <= x
|