HDLRuby 2.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/HDLRuby.gemspec +36 -0
- data/LICENSE.txt +21 -0
- data/README.md +2774 -0
- data/README.pdf +0 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/hdrcc +3 -0
- data/lib/HDLRuby/alcc.rb +137 -0
- data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
- data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
- data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
- data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
- data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
- data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
- data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
- data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
- data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
- data/lib/HDLRuby/hdr_samples/include.rb +14 -0
- data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
- data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
- data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
- data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
- data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
- data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
- data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
- data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
- data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
- data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
- data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
- data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
- data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
- data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
- data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
- data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
- data/lib/HDLRuby/hdrcc.rb +623 -0
- data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
- data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
- data/lib/HDLRuby/high_samples/adder.rb +21 -0
- data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
- data/lib/HDLRuby/high_samples/addsub.rb +33 -0
- data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
- data/lib/HDLRuby/high_samples/after.rb +28 -0
- data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
- data/lib/HDLRuby/high_samples/alu.rb +61 -0
- data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
- data/lib/HDLRuby/high_samples/before.rb +28 -0
- data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
- data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
- data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
- data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
- data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
- data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
- data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
- data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
- data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
- data/lib/HDLRuby/high_samples/case.rb +32 -0
- data/lib/HDLRuby/high_samples/case2.rb +30 -0
- data/lib/HDLRuby/high_samples/change.rb +23 -0
- data/lib/HDLRuby/high_samples/clocks.rb +35 -0
- data/lib/HDLRuby/high_samples/comparer.rb +21 -0
- data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
- data/lib/HDLRuby/high_samples/dff.rb +23 -0
- data/lib/HDLRuby/high_samples/each.rb +28 -0
- data/lib/HDLRuby/high_samples/exporter.rb +42 -0
- data/lib/HDLRuby/high_samples/functions.rb +60 -0
- data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
- data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
- data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
- data/lib/HDLRuby/high_samples/instance.rb +37 -0
- data/lib/HDLRuby/high_samples/memory.rb +64 -0
- data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
- data/lib/HDLRuby/high_samples/overload.rb +32 -0
- data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
- data/lib/HDLRuby/high_samples/ram.rb +27 -0
- data/lib/HDLRuby/high_samples/registers.rb +139 -0
- data/lib/HDLRuby/high_samples/rom.rb +23 -0
- data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
- data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
- data/lib/HDLRuby/high_samples/shift.rb +31 -0
- data/lib/HDLRuby/high_samples/shift2.rb +40 -0
- data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
- data/lib/HDLRuby/high_samples/test_all.sh +10 -0
- data/lib/HDLRuby/high_samples/typedef.rb +24 -0
- data/lib/HDLRuby/high_samples/values.rb +70 -0
- data/lib/HDLRuby/high_samples/vector.rb +22 -0
- data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
- data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
- data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
- data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
- data/lib/HDLRuby/hruby_bstr.rb +1085 -0
- data/lib/HDLRuby/hruby_check.rb +317 -0
- data/lib/HDLRuby/hruby_db.rb +432 -0
- data/lib/HDLRuby/hruby_error.rb +44 -0
- data/lib/HDLRuby/hruby_high.rb +4103 -0
- data/lib/HDLRuby/hruby_low.rb +4735 -0
- data/lib/HDLRuby/hruby_low2c.rb +1986 -0
- data/lib/HDLRuby/hruby_low2high.rb +738 -0
- data/lib/HDLRuby/hruby_low2seq.rb +248 -0
- data/lib/HDLRuby/hruby_low2sym.rb +126 -0
- data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
- data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
- data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
- data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
- data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
- data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
- data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
- data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
- data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
- data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
- data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
- data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
- data/lib/HDLRuby/hruby_serializer.rb +398 -0
- data/lib/HDLRuby/hruby_tools.rb +37 -0
- data/lib/HDLRuby/hruby_types.rb +239 -0
- data/lib/HDLRuby/hruby_values.rb +64 -0
- data/lib/HDLRuby/hruby_verilog.rb +1888 -0
- data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
- data/lib/HDLRuby/low_samples/adder.yaml +97 -0
- data/lib/HDLRuby/low_samples/after.yaml +228 -0
- data/lib/HDLRuby/low_samples/before.yaml +223 -0
- data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
- data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
- data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
- data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
- data/lib/HDLRuby/low_samples/case.yaml +327 -0
- data/lib/HDLRuby/low_samples/change.yaml +135 -0
- data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
- data/lib/HDLRuby/low_samples/cloner.rb +22 -0
- data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
- data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
- data/lib/HDLRuby/low_samples/dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/each.yaml +1328 -0
- data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
- data/lib/HDLRuby/low_samples/functions.yaml +298 -0
- data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
- data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
- data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
- data/lib/HDLRuby/low_samples/memory.yaml +678 -0
- data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
- data/lib/HDLRuby/low_samples/overload.yaml +226 -0
- data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
- data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/ram.yaml +207 -0
- data/lib/HDLRuby/low_samples/registers.yaml +228 -0
- data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
- data/lib/HDLRuby/low_samples/shift.yaml +230 -0
- data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
- data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
- data/lib/HDLRuby/low_samples/test_all.sh +43 -0
- data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
- data/lib/HDLRuby/low_samples/values.yaml +577 -0
- data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/vector.yaml +56 -0
- data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
- data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
- data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
- data/lib/HDLRuby/sim/Makefile +19 -0
- data/lib/HDLRuby/sim/hruby_sim.h +590 -0
- data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
- data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
- data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
- data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
- data/lib/HDLRuby/std/channel.rb +354 -0
- data/lib/HDLRuby/std/clocks.rb +165 -0
- data/lib/HDLRuby/std/counters.rb +82 -0
- data/lib/HDLRuby/std/decoder.rb +214 -0
- data/lib/HDLRuby/std/fsm.rb +516 -0
- data/lib/HDLRuby/std/pipeline.rb +220 -0
- data/lib/HDLRuby/std/reconf.rb +309 -0
- data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
- data/lib/HDLRuby/test_hruby_high.rb +594 -0
- data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
- data/lib/HDLRuby/test_hruby_low.rb +934 -0
- data/lib/HDLRuby/v_samples/adder.v +10 -0
- data/lib/HDLRuby/v_samples/dff.v +12 -0
- data/lib/HDLRuby/v_samples/ram.v +20 -0
- data/lib/HDLRuby/v_samples/rom.v +270 -0
- data/lib/HDLRuby/version.rb +3 -0
- data/lib/HDLRuby.rb +11 -0
- data/makedoc +1 -0
- data/metadata.yaml +4 -0
- metadata +299 -0
@@ -0,0 +1,590 @@
|
|
1
|
+
/**
|
2
|
+
* The HDLRuby simulation global header, to include in C code
|
3
|
+
* generated by hruby_low2c.
|
4
|
+
**/
|
5
|
+
|
6
|
+
#include <pthread.h>
|
7
|
+
|
8
|
+
|
9
|
+
/* The interface to the HDLRuby objects C models. */
|
10
|
+
|
11
|
+
typedef struct TypeS_ TypeS;
|
12
|
+
typedef struct FlagsS_ FlagsS;
|
13
|
+
typedef struct ValueS_ ValueS;
|
14
|
+
typedef struct ObjectS_ ObjectS;
|
15
|
+
typedef struct SystemTS_ SystemTS;
|
16
|
+
typedef struct SignalIS_ SignalIS;
|
17
|
+
typedef struct ScopeS_ ScopeS;
|
18
|
+
typedef struct BehaviorS_ BehaviorS;
|
19
|
+
typedef struct SystemIS_ SystemIS;
|
20
|
+
typedef struct CodeS_ CodeS;
|
21
|
+
typedef struct BlockS_ BlockS;
|
22
|
+
typedef struct EventS_ EventS;
|
23
|
+
|
24
|
+
typedef struct RefRangeS_ RefRangeS;
|
25
|
+
|
26
|
+
typedef struct TypeS_* Type;
|
27
|
+
typedef struct ValueS_* Value;
|
28
|
+
typedef struct ObjectS_* Object;
|
29
|
+
typedef struct SystemTS_* SystemT;
|
30
|
+
typedef struct SignalIS_* SignalI;
|
31
|
+
typedef struct ScopeS_* Scope;
|
32
|
+
typedef struct BehaviorS_* Behavior;
|
33
|
+
typedef struct SystemIS_* SystemI;
|
34
|
+
typedef struct CodeS_* Code;
|
35
|
+
typedef struct BlockS_* Block;
|
36
|
+
typedef struct EventS_* Event;
|
37
|
+
|
38
|
+
typedef struct RefRangeS_* RefRange;
|
39
|
+
|
40
|
+
/* The kinds of HDLRuby objects. */
|
41
|
+
typedef enum {
|
42
|
+
OBJECT, SYSTEMT, SIGNALI, SCOPE, BEHAVIOR, SYSTEMI, CODE, BLOCK, EVENT
|
43
|
+
} Kind;
|
44
|
+
|
45
|
+
/* The kinds of HDLRuby event edge. */
|
46
|
+
typedef enum {
|
47
|
+
ANYEDGE, POSEDGE, NEGEDGE
|
48
|
+
} Edge;
|
49
|
+
|
50
|
+
|
51
|
+
/* The interface to the type engine. */
|
52
|
+
typedef struct FlagsS_ {
|
53
|
+
unsigned int all;
|
54
|
+
unsigned int sign : 1; /* Tells if the type is signed or not. */
|
55
|
+
} FlagsS;
|
56
|
+
|
57
|
+
/** The type structure. */
|
58
|
+
typedef struct TypeS_ {
|
59
|
+
unsigned long long base; /* The size in bits of the base elements. */
|
60
|
+
unsigned long long number; /* The number of elements of the type. */
|
61
|
+
FlagsS flags; /* The features of the type. */
|
62
|
+
} TypeS;
|
63
|
+
|
64
|
+
|
65
|
+
/** Computes the width in bits of a type.
|
66
|
+
* @param type the type to compute the width
|
67
|
+
* @return the resulting width in bits */
|
68
|
+
extern unsigned long long type_width(Type type);
|
69
|
+
|
70
|
+
/** Gets the single bit type. */
|
71
|
+
extern Type get_type_bit();
|
72
|
+
|
73
|
+
/** Gets the single signed bit type. */
|
74
|
+
extern Type get_type_signed();
|
75
|
+
|
76
|
+
/** Creates a new type from a HDLRuby TypeVector.
|
77
|
+
* @param base the type of an element
|
78
|
+
* @param number the number of base elements */
|
79
|
+
extern Type make_type_vector(Type base, unsigned long long number);
|
80
|
+
|
81
|
+
/** Gets a vector type by size and base.
|
82
|
+
* @param base the type of an element
|
83
|
+
* @param number the number of base elements */
|
84
|
+
extern Type get_type_vector(Type base, unsigned long long number);
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
/* The interface to the value computation engine. */
|
89
|
+
|
90
|
+
/* The structure of a value. */
|
91
|
+
typedef struct ValueS_ {
|
92
|
+
Type type; /* The type of the value. */
|
93
|
+
int numeric; /* Tell if the value is numeric or a bitstring. */
|
94
|
+
unsigned long long capacity; /* The capacity in char of the bit string. */
|
95
|
+
char* data_str; /* The bit string data if not numeric. */
|
96
|
+
unsigned long long data_int;/* The integer data if numeric. */
|
97
|
+
SignalI signal; /* The signal associated with the value if any. */
|
98
|
+
} ValueS;
|
99
|
+
|
100
|
+
/* The tructure of a reference to a range in a value. */
|
101
|
+
typedef struct RefRangeS_ {
|
102
|
+
SignalI signal; /* The refered signal. */
|
103
|
+
unsigned long long first; /* The first index in the range. */
|
104
|
+
unsigned long long last; /* The last index in the range. */
|
105
|
+
} RefRangeS;
|
106
|
+
|
107
|
+
/** Creates a new value.
|
108
|
+
* @param type the type of the value
|
109
|
+
* @param numeric tells if the value is numeric or not
|
110
|
+
* @return the resulting value */
|
111
|
+
extern Value make_value(Type type,int numeric);
|
112
|
+
|
113
|
+
/** Sets a value with data.
|
114
|
+
* @param value the value to fill
|
115
|
+
* @param numeric tell if the value is in numeric form or in bitstring form
|
116
|
+
* @param data the source data */
|
117
|
+
extern void set_value(Value value, int numeric, void* data);
|
118
|
+
|
119
|
+
/** Makes and sets a value with data.
|
120
|
+
* @param type the type of the value
|
121
|
+
* @param numeric tell if the value is in numeric form or in bitstring form
|
122
|
+
* @param data the source data */
|
123
|
+
extern Value make_set_value(Type type, int numeric, void* data);
|
124
|
+
|
125
|
+
|
126
|
+
/** Computes the neg of a value.
|
127
|
+
* @param src the source value of the neg
|
128
|
+
* @param dst the destination value
|
129
|
+
* @return dst */
|
130
|
+
extern Value neg_value(Value src, Value dst);
|
131
|
+
|
132
|
+
/** Computes the addition of two values.
|
133
|
+
* @param src0 the first source value of the addition
|
134
|
+
* @param src1 the second source value of the addition
|
135
|
+
* @param dst the destination value
|
136
|
+
* @return dst */
|
137
|
+
extern Value add_value(Value src0, Value src1, Value dst);
|
138
|
+
|
139
|
+
/** Computes the subtraction of two values.
|
140
|
+
* @param src0 the first source value of the subtraction
|
141
|
+
* @param src1 the second source value of the subtraction
|
142
|
+
* @param dst the destination value
|
143
|
+
* @return dst */
|
144
|
+
extern Value sub_value(Value src0, Value src1, Value dst);
|
145
|
+
|
146
|
+
/** Computes the not of a value.
|
147
|
+
* @param src the source value of the not
|
148
|
+
* @param dst the destination value
|
149
|
+
* @return dst */
|
150
|
+
extern Value not_value(Value src, Value dst);
|
151
|
+
|
152
|
+
/** Computes the AND of two values.
|
153
|
+
* @param src0 the first source value of the and
|
154
|
+
* @param src1 the second source value of the and
|
155
|
+
* @param dst the destination value
|
156
|
+
* @return dst */
|
157
|
+
extern Value and_value(Value src0, Value src1, Value dst);
|
158
|
+
|
159
|
+
/** Computes the OR of two values.
|
160
|
+
* @param src0 the first source value of the or
|
161
|
+
* @param src1 the second source value of the or
|
162
|
+
* @param dst the destination value
|
163
|
+
* @return dst */
|
164
|
+
extern Value or_value(Value src0, Value src1, Value dst);
|
165
|
+
|
166
|
+
/** Computes the XOR of two values.
|
167
|
+
* @param src0 the first source value of the or
|
168
|
+
* @param src1 the second source value of the or
|
169
|
+
* @param dst the destination value
|
170
|
+
* @return dst */
|
171
|
+
extern Value xor_value(Value src0, Value src1, Value dst);
|
172
|
+
|
173
|
+
/** Computes the left shift of two general values.
|
174
|
+
* @param src0 the first source value of the addition
|
175
|
+
* @param src1 the second source value of the addition
|
176
|
+
* @param dst the destination
|
177
|
+
* @return dst */
|
178
|
+
Value shift_left_value(Value src0, Value src1, Value dst);
|
179
|
+
|
180
|
+
/** Computes the right shift of two general values.
|
181
|
+
* @param src0 the first source value of the addition
|
182
|
+
* @param src1 the second source value of the addition
|
183
|
+
* @param dst the destination
|
184
|
+
* @return dst */
|
185
|
+
Value shift_right_value(Value src0, Value src1, Value dst);
|
186
|
+
|
187
|
+
/** Computes the equal (NXOR) of two values.
|
188
|
+
* @param src0 the first source value of the addition
|
189
|
+
* @param src1 the second source value of the addition
|
190
|
+
* @param dst the destination value
|
191
|
+
* @return dst */
|
192
|
+
extern Value equal_value(Value src0, Value src1, Value dst);
|
193
|
+
|
194
|
+
/** Selects a value depending on a condition.
|
195
|
+
* @param cond the condition to use for selecting a value
|
196
|
+
* @param dst the destination value
|
197
|
+
* @param num the number of values for the selection
|
198
|
+
* @return the selected value */
|
199
|
+
extern Value select_value(Value cond, Value dst, unsigned int num, ...);
|
200
|
+
|
201
|
+
/** Concat multiple values to a single one.
|
202
|
+
* @param num the number of values to concat
|
203
|
+
* @param dir the direction of concatenation
|
204
|
+
* @param dst the destination value
|
205
|
+
* @return dst */
|
206
|
+
extern Value concat_value(int num, int dir, Value dst, ...);
|
207
|
+
|
208
|
+
/** Casts a value to another type.
|
209
|
+
* @param src the source value
|
210
|
+
* @param type the type to cast to
|
211
|
+
* @param dst the destination value
|
212
|
+
* @return dst */
|
213
|
+
extern Value cast_value(Value src, Type type, Value dst);
|
214
|
+
|
215
|
+
/** Copies a value to another, the type of the destination is preserved.
|
216
|
+
* @param src the source value
|
217
|
+
* @param dst the destination value
|
218
|
+
* @return dst */
|
219
|
+
extern Value copy_value(Value src, Value dst);
|
220
|
+
|
221
|
+
/** Copies a value to another but without overwritting with Z, the type of
|
222
|
+
* the destination is preserved.
|
223
|
+
* @param src the source value
|
224
|
+
* @param dst the destination value
|
225
|
+
* @return dst */
|
226
|
+
extern Value copy_value_no_z(Value src, Value dst);
|
227
|
+
|
228
|
+
/** Testing if a value is 0.
|
229
|
+
* @param value the value to check
|
230
|
+
* @return 1 if 0 and 0 otherwize */
|
231
|
+
extern int zero_value(Value value);
|
232
|
+
|
233
|
+
/** Testing if a value is defined or not.
|
234
|
+
* @param value the value to check
|
235
|
+
* @return 1 if defined and 0 otherwize */
|
236
|
+
extern int is_defined_value(Value value);
|
237
|
+
|
238
|
+
/** Testing if two values have the same content (the type is not checked).
|
239
|
+
* @param value0 the first value to compare
|
240
|
+
* @param value1 the second value to compare
|
241
|
+
* @return 1 if same content. */
|
242
|
+
extern int same_content_value(Value value0, Value value1);
|
243
|
+
|
244
|
+
/** Testing if two values have the same content (the type is not checked).
|
245
|
+
* @param value0 the first value to compare
|
246
|
+
* @param first the first index of the range
|
247
|
+
* @param last the last index of the range
|
248
|
+
* @param value1 the second value to compare
|
249
|
+
* @return 1 if same content. */
|
250
|
+
extern int same_content_value_range(Value value0, unsigned long long first,
|
251
|
+
unsigned long long last, Value value1);
|
252
|
+
|
253
|
+
/** Creates a reference to a range inside a signal.
|
254
|
+
* @param signal the signal to refer
|
255
|
+
* @param first the start index of the range
|
256
|
+
* @param last the end index of the range
|
257
|
+
* @return the resulting reference */
|
258
|
+
extern RefRangeS make_ref_rangeS(SignalI signal, unsigned long long first,
|
259
|
+
unsigned long long last);
|
260
|
+
|
261
|
+
|
262
|
+
/* The interface for the lists. */
|
263
|
+
|
264
|
+
/** The list element data structure. */
|
265
|
+
typedef struct ElemS_ {
|
266
|
+
void* data; /* The data stored in the element. */
|
267
|
+
struct ElemS_* next; /* The next element in the lisdt if any. */
|
268
|
+
} ElemS;
|
269
|
+
|
270
|
+
typedef ElemS* Elem;
|
271
|
+
|
272
|
+
/** The list data structure. */
|
273
|
+
typedef struct ListS_ {
|
274
|
+
Elem head; /* The head of the list */
|
275
|
+
Elem tail; /* The tail of the list */
|
276
|
+
} ListS;
|
277
|
+
|
278
|
+
typedef ListS* List;
|
279
|
+
|
280
|
+
/** Get a list element for containing some data.
|
281
|
+
* @param data the data of the element
|
282
|
+
* @return the resulting element */
|
283
|
+
extern Elem get_element(void* data);
|
284
|
+
|
285
|
+
/** Delete an element (it will return to the pool).
|
286
|
+
* @param elem the element to delete */
|
287
|
+
void delete_element(Elem elem);
|
288
|
+
|
289
|
+
/** Tells if a list is empty.
|
290
|
+
* @param list the list to check. */
|
291
|
+
#define empty_list(list) ((list)->head == NULL)
|
292
|
+
|
293
|
+
/** Builds a list.
|
294
|
+
* @param list the place where to build the list
|
295
|
+
* @return the resulting list */
|
296
|
+
extern List build_list(List list);
|
297
|
+
|
298
|
+
/** Clears a list.
|
299
|
+
* @param list the list to clear */
|
300
|
+
extern void clear_list(List list);
|
301
|
+
|
302
|
+
/** Adds an element to the tail of a list.
|
303
|
+
* @param list the list to add the element in
|
304
|
+
* @param elem the element to add in the list */
|
305
|
+
extern void add_list(List list, Elem elem);
|
306
|
+
|
307
|
+
/** Remove the head of the list.
|
308
|
+
* @param list the list to remove the head from
|
309
|
+
* @return the removed element */
|
310
|
+
extern Elem remove_list(List list);
|
311
|
+
|
312
|
+
|
313
|
+
/* The interface for the pool of values. */
|
314
|
+
|
315
|
+
/** Get a fresh value. */
|
316
|
+
extern Value get_value();
|
317
|
+
|
318
|
+
/** Frees the last value of the pool. */
|
319
|
+
extern void free_value();
|
320
|
+
|
321
|
+
/** Gets the current state of the value pool. */
|
322
|
+
extern unsigned int get_value_pos();
|
323
|
+
|
324
|
+
/** Restores the state of the value pool.
|
325
|
+
* @param pos the new position in the pool */
|
326
|
+
extern void set_value_pos(unsigned int pos);
|
327
|
+
|
328
|
+
/** An HDLRuby object. */
|
329
|
+
typedef struct ObjectS_ {
|
330
|
+
Kind kind; /* The kind of object. */
|
331
|
+
Object owner; /* The owner of the object if any. */
|
332
|
+
} ObjectS;
|
333
|
+
|
334
|
+
|
335
|
+
/** The C model of a SystemT. */
|
336
|
+
typedef struct SystemTS_ {
|
337
|
+
Kind kind; /* The kind of object. */
|
338
|
+
Object owner; /* The owner if any. */
|
339
|
+
|
340
|
+
char* name; /* The name of the system. */
|
341
|
+
int num_inputs; /* The number of inputs. */
|
342
|
+
SignalI* inputs; /* The inputs of the system. */
|
343
|
+
int num_outputs; /* The number of outputs. */
|
344
|
+
SignalI* outputs; /* The outputs of the system. */
|
345
|
+
int num_inouts; /* The number of inouts. */
|
346
|
+
SignalI* inouts; /* The inouts of the system. */
|
347
|
+
Scope scope; /* The scope of the system. */
|
348
|
+
} SystemTS;
|
349
|
+
|
350
|
+
|
351
|
+
/** The C model of a Signal. */
|
352
|
+
typedef struct SignalIS_ {
|
353
|
+
Kind kind; /* The kind of object. */
|
354
|
+
Object owner; /* The owner if any. */
|
355
|
+
|
356
|
+
char* name; /* The name of the signal. */
|
357
|
+
Type type; /* The type of the signal. */
|
358
|
+
Value c_value; /* The current value of the signal. */
|
359
|
+
Value f_value; /* The future (next) value of the signal. */
|
360
|
+
|
361
|
+
int fading; /* Tell if the signal can be overwritten by Z. */
|
362
|
+
|
363
|
+
int num_any; /* The number of behavior activated on any edge. */
|
364
|
+
Object* any; /* The objects activated on any edge. */
|
365
|
+
int num_pos; /* The number of behavior activated on pos edge. */
|
366
|
+
Object* pos; /* The objects actvated on pos edge. */
|
367
|
+
int num_neg; /* The number of behavior activated on neg edge. */
|
368
|
+
Object* neg; /* The objects actvated on neg edge. */
|
369
|
+
} SignalIS;
|
370
|
+
|
371
|
+
|
372
|
+
/** The C model of a system instance. */
|
373
|
+
typedef struct SystemIS_ {
|
374
|
+
Kind kind; /* The kind of object. */
|
375
|
+
Object owner; /* The owner if any. */
|
376
|
+
|
377
|
+
char* name; /* The name of the signal. */
|
378
|
+
SystemT system; /* The instantiated system. */
|
379
|
+
} SystemIS;
|
380
|
+
|
381
|
+
|
382
|
+
/** The C model of a Scope. */
|
383
|
+
typedef struct ScopeS_ {
|
384
|
+
Kind kind; /* The kind of object. */
|
385
|
+
Object owner; /* The owner if any. */
|
386
|
+
|
387
|
+
char* name; /* The name of the scope. */
|
388
|
+
int num_systemIs; /* The number of system instances. */
|
389
|
+
SystemI* systemIs; /* The system instances of the scope. */
|
390
|
+
int num_inners; /* The number of inners. */
|
391
|
+
SignalI* inners; /* The inners of the scope. */
|
392
|
+
int num_scopes; /* The number of sub scopes. */
|
393
|
+
Scope *scopes; /* The sub scopes of the scope. */
|
394
|
+
int num_behaviors; /* The number of behaviors. */
|
395
|
+
Behavior* behaviors;/* The behaviors of the scope. */
|
396
|
+
int num_codes; /* The number of non-HDLRuby codes. */
|
397
|
+
Code* codes; /* The non-HDLRuby codes of the scope. */
|
398
|
+
} ScopeS;
|
399
|
+
|
400
|
+
|
401
|
+
/** The C model of a behavior. */
|
402
|
+
typedef struct BehaviorS_ {
|
403
|
+
Kind kind; /* The kind of object. */
|
404
|
+
Object owner; /* The owner if any. */
|
405
|
+
|
406
|
+
int num_events; /* The number of events. */
|
407
|
+
Event* events; /* The events of the behavior. */
|
408
|
+
Block block; /* The block of the behavior. */
|
409
|
+
|
410
|
+
int activated; /* Tells if the behavior is activated or not. */
|
411
|
+
|
412
|
+
int timed; /* Tell if the behavior is timed or not. */
|
413
|
+
unsigned long long active_time; /* The next time the behavior has to be activated. */
|
414
|
+
pthread_t thread; /* The thread assotiated with the behavior (if any).*/
|
415
|
+
} BehaviorS;
|
416
|
+
|
417
|
+
|
418
|
+
/** The C model of non-HDLRuby code. */
|
419
|
+
typedef struct CodeS_ {
|
420
|
+
Kind kind; /* The kind of object. */
|
421
|
+
Object owner; /* The owner if any. */
|
422
|
+
|
423
|
+
int num_events; /* The number of events. */
|
424
|
+
Event* events; /* The events of the behavior. */
|
425
|
+
void (*function)(); /* The function to execute for the code. */
|
426
|
+
|
427
|
+
int activated; /* Tells if the code is activated or not. */
|
428
|
+
} CodeS;
|
429
|
+
|
430
|
+
|
431
|
+
/** The C model of a Scope. */
|
432
|
+
typedef struct BlockS_ {
|
433
|
+
Kind kind; /* The kind of object. */
|
434
|
+
Object owner; /* The owner if any. */
|
435
|
+
|
436
|
+
int num_inners; /* The number of inners. */
|
437
|
+
SignalI* inners; /* The inners of the scope. */
|
438
|
+
void (*function)(); /* The function to execute for the block. */
|
439
|
+
} BlockS;
|
440
|
+
|
441
|
+
|
442
|
+
/** The C model of a Scope. */
|
443
|
+
typedef struct EventS_ {
|
444
|
+
Kind kind; /* The kind of object. */
|
445
|
+
Object owner; /* The owner if any. */
|
446
|
+
|
447
|
+
Edge edge; /* The edge of the event. */
|
448
|
+
SignalI signal; /* The signal of the event. */
|
449
|
+
} EventS;
|
450
|
+
|
451
|
+
|
452
|
+
|
453
|
+
/* The interface to the simulator. */
|
454
|
+
|
455
|
+
/* The time units. */
|
456
|
+
typedef enum { S, MS, US, NS, FS } Unit;
|
457
|
+
|
458
|
+
/** Adds a timed behavior for processing.
|
459
|
+
* @param behavior the timed behavior to register */
|
460
|
+
extern void register_timed_behavior(Behavior behavior);
|
461
|
+
|
462
|
+
/** Adds a signal for global processing.
|
463
|
+
* @param signal the signal to register */
|
464
|
+
extern void register_signal(SignalI signal);
|
465
|
+
|
466
|
+
/** Makes the behavior wait for a given time.
|
467
|
+
* @param delay the delay to wait in fs.
|
468
|
+
* @param behavior the current behavior. */
|
469
|
+
extern void hw_wait(unsigned long long delay, Behavior behavior);
|
470
|
+
|
471
|
+
// /** Transmit a signal to another signal.
|
472
|
+
// * @param dst the destination signal
|
473
|
+
// * @param src the source signal */
|
474
|
+
// extern void transmit(SignalI src, SignalI dst);
|
475
|
+
|
476
|
+
/** Touch a signal.
|
477
|
+
* @param signal the signal to touch */
|
478
|
+
extern void touch_signal(SignalI signal);
|
479
|
+
|
480
|
+
/** Transmit a value to a signal.
|
481
|
+
* @param value the value to transmit
|
482
|
+
* @param signal the signal to transmit the value to. */
|
483
|
+
extern void transmit_to_signal(Value value, SignalI signal);
|
484
|
+
|
485
|
+
/** Transmit a value to a range within a signal.
|
486
|
+
* @param value the value to transmit
|
487
|
+
* @param ref the reference to the range in the signal to transmit the
|
488
|
+
* value to. */
|
489
|
+
extern void transmit_to_signal_range(Value value, RefRangeS ref);
|
490
|
+
|
491
|
+
|
492
|
+
/** Touch a signal. in case of a sequential execution model.
|
493
|
+
* @param signal the signal to touch */
|
494
|
+
extern void touch_signal_seq(SignalI signal);
|
495
|
+
|
496
|
+
/** Transmit a value to a signal in case of a sequential execution model.
|
497
|
+
* @param value the value to transmit
|
498
|
+
* @param signal the signal to transmit the value to. */
|
499
|
+
extern void transmit_to_signal_seq(Value value, SignalI signal);
|
500
|
+
|
501
|
+
/** Transmit a value to a range within a signal in case of sequential
|
502
|
+
* execution model.
|
503
|
+
* @param value the value to transmit
|
504
|
+
* @param ref the reference to the range in the signal to transmit the
|
505
|
+
* value to. */
|
506
|
+
extern void transmit_to_signal_range_seq(Value value, RefRangeS ref);
|
507
|
+
|
508
|
+
/** Creates an event.
|
509
|
+
* @param edge the edge of the event
|
510
|
+
* @param signal the signal of the event */
|
511
|
+
extern Event make_event(Edge edge, SignalI signal);
|
512
|
+
|
513
|
+
/** Creates a delay.
|
514
|
+
* Actually generates an unsigned long long giving the corresponding
|
515
|
+
* delay in the base unit of the simulator.
|
516
|
+
* @param value the value of the delay
|
517
|
+
* @param unit the used unit
|
518
|
+
* @return the result delay in the base unit of the simulator (ns) */
|
519
|
+
extern unsigned long long make_delay(int value, Unit unit);
|
520
|
+
|
521
|
+
|
522
|
+
|
523
|
+
|
524
|
+
/* Interface to the visualization engine. */
|
525
|
+
|
526
|
+
/** Prints the time.
|
527
|
+
* @param time the time to show. */
|
528
|
+
extern void print_time(unsigned long long time);
|
529
|
+
|
530
|
+
/** Prints the time and goes to the next line.
|
531
|
+
* @param time the time to show. */
|
532
|
+
extern void println_time(unsigned long long time);
|
533
|
+
|
534
|
+
/** Prints the name of an object.
|
535
|
+
* @param object the object to print the name. */
|
536
|
+
extern void print_name(Object object);
|
537
|
+
|
538
|
+
/** Prints a value.
|
539
|
+
* @param value the value to print */
|
540
|
+
extern void print_value(Value value);
|
541
|
+
|
542
|
+
/** Prints a signal.
|
543
|
+
* @param signal the signal to show */
|
544
|
+
extern void print_signal(SignalI signal);
|
545
|
+
|
546
|
+
/** Prints a signal and goes to the next line.
|
547
|
+
* @param signal the signal to show */
|
548
|
+
extern void println_signal(SignalI signal);
|
549
|
+
|
550
|
+
|
551
|
+
/* The interface to the simulator core. */
|
552
|
+
|
553
|
+
/** The simulation core function.
|
554
|
+
* @param limit the time limit in fs. */
|
555
|
+
extern void hruby_sim_core(unsigned long long limit);
|
556
|
+
|
557
|
+
|
558
|
+
|
559
|
+
/* Access and conversion functions. */
|
560
|
+
|
561
|
+
/** Converts a value to a long long int.
|
562
|
+
* @param value the value to convert
|
563
|
+
* @return the resulting unsigned int. */
|
564
|
+
extern unsigned long long value2integer(Value value);
|
565
|
+
|
566
|
+
/** Reads a range from a value.
|
567
|
+
* @param value the value to read
|
568
|
+
* @param first the first index of the range
|
569
|
+
* @param last the last index of the range
|
570
|
+
* @param base the type of the elements
|
571
|
+
* @param dst the destination value
|
572
|
+
* @return dst */
|
573
|
+
extern Value read_range(Value value, long long first, long long last,
|
574
|
+
Type base, Value dst);
|
575
|
+
|
576
|
+
/** Writes to a range within a value.
|
577
|
+
* @param src the source value
|
578
|
+
* @param first the first index of the range
|
579
|
+
* @param last the last index of the range
|
580
|
+
* @param dst the destination value
|
581
|
+
* @return dst */
|
582
|
+
extern Value write_range(Value src, long long first, long long last, Value dst);
|
583
|
+
|
584
|
+
/** Writes to a range within a value but without overwrite with Z.
|
585
|
+
* @param src the source value
|
586
|
+
* @param first the first index of the range
|
587
|
+
* @param last the last index of the range
|
588
|
+
* @param dst the destination value
|
589
|
+
* @return dst */
|
590
|
+
extern Value write_range_no_z(Value src, long long first, long long last, Value dst);
|