summaryrefslogtreecommitdiff
path: root/translate/TODO
blob: c2da8aa21d8ae54b86ed0aa6008dd4580e756e79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
BUGS:
* GCC 4.0.1
* bug may25 rob chapman (interface).
* bug jun14 peter TB brett (unconstr out assigned with (others => x))
* bug stephen leak
* bug elab of pr/warnings-0/conf1.vhdl (unconstrained signals)
* bug ~/conf2.vhdl: arch subprogram is not translated for config (check with
  ghdl1-debug).
* bug ~/conf3.vhdl: problem while counting signals.
* from a typical vhdl file, create new files with 1 or more tokens removed.
  Check diags.
* bug IR2069
* bug unconstrained port and func conv: see IR2064
* bug david-kuehling with signals (array_subtype_ptr)
* translate_object: no parent.
* waves: verilog types, physical types.
* waves: ghwdump util to be put into ghdl exec ?
* grt: --dump-rti, --dump-signals: modules?
todo: web site: add ghdl.ps, ghdl.pdf

PEFS:
* DONE: add an hash table for primary unit (cf unisim).
* use hash table for get_lastest_arch
* DONE: ieee_xxx_resolv for ghdl_run

* TOP:
* vhdl93
* DONE: new node format
* DONE: grt: do not depends on libgnat [malloc/free; gnat.table; rcheck; stdio]
* sem_name: check all possibilities, recursion on prefix for finish_ and free.

* length : use left and right from type range if any.
* subtype descriptor : can be a const.
* checks on type (values out of bounds).
* deallocate: in depth.
* iterator on array elements.

* GHDL:
* DONE: val_staticness for aggregates
* libraries: the first line of the .cf files must contains options/standard.
* global file for setup (vhdl version, mapping)
* eval static expressions automaticaly.
* check for no return in a function, generate code to catch this error.
* DONE: detect no wait in processes.
* clean-up dependences check (cf libraries.is_obsolete)
* AMS-VHDL: reserved keywords
* replace implicit_functions of type decl with implicit_subprograms
* add an option to disable eval_if_static_expr (to check more).
* handle "-- pragma xxx"
* handle locally static disconnection_spec in canon
* use MD5/SHA1 instead of dates
* add_dependence: add a flag to mark dependence (to be restored/backuped)
* visible_flag: check for operator
* individual assocs: multi-dim arrays
* static name: if the value is an access, the name is not static.
* DONE: preference for universal primitives (function call).
* check rules for building default sensitivity list.
* overload in case/select signal assignment
* array access subtype.
* DONE: triple use clauses
* DONE: use clauses (list)
* visibility in configuration declaration.
* DONE: hide implicit defined subprograms when overridden by explicit one.
* DONE: script to do all checks from a tar file
* DONE: sem_name -> sem_scopes
* DONE: sem_names.ads/adb
* DONE: eval string literal (add list)
* DONE: export files for GCC, build in GCC.
* DONE: name visibility
* DONE: create iir_kind_error 
* DONE: add base_name field for _name iirs.
* DONE: check accesses with base_name.
* attributes: check all entity name kind (labels, file...)
* DONE: attributes: only one per simple name.
* incremental binding: different entity in entity aspect of primary binding.
* DONE: overload number in IIRS.
* subprogram_instances: remove decl_type (only use ptr_type).
* pure during elab: load package only if necessary.
* purity state of implicit subprograms.
* seen_flag: remove (unused).
* DONE: location_end: add for design units.
* 'image, 'value: eval_static_expr, to be completed.

* IIRS:
* formats: Declaration, Integer, Real, Small, Medium
* + lists
* common: kind/flags/staticness/digits (32), loc(32)
          4 fields (4 * 32) + back_end (??) + parent (??)
* Integer: + int (64) (?? for physicals: origin,unit,type)
* real:    + real (64)
* small:   + 2 fields (2 * 32)
* medium:  + 2 + 7 fields (9 * 32)
* Decls:   + link (32), ident (32), attr (32), parent (32),
	     1+2+4 fields (7 * 32) + second link (?)

* ghdlmake:
* DONE: add object files from grt
* selection of run time?
* DONE: object files location (fix how std is currently handled).
* verbose or long flag for -d: disp file name
* handle multiple libraries
* -n: do not compile/elaborate.
* DONE: -cargs: additional args for compiler (+ -largs)
* add dependences for all design units.
* create or accept WAVES header for compilation order
* -i: incremental analyse: analyse only if not up to date
* -m: re-read library file before final elaboration, because dependences may
  have changed.
* -m : to be renamed to -u
* use default configurations for dependences
* DONE: add other files
* add these options: --AS=, --LD=, --POST=, -static, -shared
* -m bugs: hc11core, fphdl
* create configuration
* DONE: chop

* VITAL:
* CELLTYPE
* finish Level0
* SDF 3.0, 4.0
* SDF: bus, all types
* negative delay

* elaboration:
* DONE: late binding
* DONE: should load the top entity to check for no generics nor in ports.
* DONE: should load package body to check passive subprg/no wait in subprg.
* elab port based on assoc list
* bug if instantiated entity is the same as the current instance ?

* grt:
* DONE: vcd: dump only when value has changed.
* vcd: handle record
* create vcd/tdml header
* set fpu in exception mode
* DONE: resize process stacks/trap stack underflow
* create a global event list, to increase speed (each signal is an element of
  the list)
* DONE: add name of processes (as an instance)

* Optimizations:
* DONE: reduce number of signals (components, instantiation...)
* DONE: std_logic signals with only one driver.
* range checks.

* translate:
* record/array file types
* DONE: aggregate target for variables
* DONE: create description of instance with an array instead of names
* DONE: create names for prefix instead of uniq id
* DONE: no type_desc for types that can't be used for signals (ex: types
  defined in subprg or processes).
* do not create signals types for constant/variable, but always create value
  types.
* rewrite procedure/function interfaces.
* attribute names
* do not translate all predefined subprograms: flag_use to be added
  be careful to packages and entity.
* WRONG: do not add instance for pure functions -> maybe required for types.
* free info
* DONE: finalization (files)
* DONE: extended identifiers
* check for no return in a function (and catch at execution time)
* range check: be smarter
* range for for-loop, slices, generates.
* flag_review: add more comments.
* DONE: alias : handle more than arrays.
* add a length field in array bounds for multi-dim array
* DONE: create an elaborator for components
* NOT RELEVANT: check for unused types infrastructures (_STB for array index)
* create signal builder for record/array (see composite_types.vhdl)
* DONE: handle package body while not necessary
* individual assoc in subprograms
* individual assoc for predefined proc (file procedures)
* check for file with same basename (ex: a.vhd and a.tvhd), since the object
  file will overwrite (or add a number ex: 00_a.o 01_a.o)

* ortho_gcc:
* overflow
* conversion

* ortho:
* DONE: check for use of variable out of its scope (add a in_use flag ?).
* -> check for no enode after a statement.
* standard types metrics.
* DONE: check scope for variables/constant/subprograms.
* enum -> new_lit
* for debug: disp/read enum size.
* new_ref -> from variable/interface/const to l_node
* offset type
* debug: check ident (redefine, overridden)

* tests
* all interfaces.
* arrays: constant, variable, signal, alias, default value,
          slice, assign, index, 'range,left,right,length attributes
* alias

* VHDL quizz:
* A and B and C, where and is not predefined and not associative -> order
  defined by lrm
* event without value change -> not possible to create such a design
* for I in 0 to 4 + 5 loop 
* my_int; function "not" (v : my_int := 0) return my_int; var := "not";
* read operation for array with multiple indexes -> not allowed
* A <= (others => 0) where A is a subprogram formal interface whose type is
  an unconstrained array.
*B function returning a file type.
* null string when index base type left bound has no pred.
* arch x of y is
    attribute my_attr of my_inst : label is 25;
    component my_comp ... end component;
  begin
    my_inst : my_comp;
  end x;
  Is my_comp a component or a procedure call ? -> label
* element declaration scope does not extend beyond a package scope -> the
  package scope is extended along with the scope of the logical library.
* labeled statement inside a for-loop can be attributed.
* "wait on S'transaction' not allowed since an attribute is not a static name.
*B constant c : integer := 3 ** 4; which "**" (universal or integer)?
   or: constant c : integer := - 1; (which "-" ?)
*B type chrptr is access character;
  type chrptr_array is array (natural range <>) of chrptr;
  -> creates an implicit function "&" whose interface is constant of type
     access. 
* package ch1003_002_pkg is
     type my_bit is ('0', '1', 'X');
     function "=" (l, r : my_bit) return boolean;
  end ch1003_002_pkg;
  ...
  use work.ch1003_002_pkg.all;
  ...
       A = B --  A and B of type my_bit
  Both the implicit and explicit "=" operator are visible!
* package p is
    function f return integer;
  end p;
  
  use work.p.all;
  package p is
    constant c : integer := f;
  end p;
* redeclaration of a design unit in vhdl02 (not allowed ?)
* 'FOREIGN for implicit subprograms ?
* 'FOREIGN with non-locally static value
*B alias of a physical type (not possible, since only the subtype is named).
* 'a''attr -> not allowed.
*B2 visibility in context clause:
  library my_lib;
  entity ent is end ent;

  use my_lib.my_pkg.all;
  architecture arch of ent is ...
* 4.2 Subtype declarations: "if a type mark is the name of a type, the type
  mark denotes this type and also the corresponding unconstrained subtype."
  What is the corresponding subtype of an enumeration type ?
  -> 3.0  "A type is a subtype of itself"
* name'a'length has no characters...
*B2 with expr select (a,b) <= "01" when c1, val when others;
  -> type of aggregate is not determinable!!
  -> or type of aggregate depends on the selected expression
   (ex: (a,b) std_logic_vector and then std_ulogic_vector)
* case statement: expression which is an indexed name and of unidim array type
  (why are the indexes locally static expressions ?)
* Is an alias overloadable (?) -> yes
* 5.2 Configuration specification: 'others' -> meaning of 'previous'
  incremental binding for different entity aspect.
  component_configuration that is a primary binding for some instantiation
    and an incremental binding indic for others.
*B 14.1 'instance_name example: missing ';' after generic clause of BComp
  component; missing ":" before gbottom'path_instance;
  signature is added for subprograms but not for enumeration literals.
  loop_label ?
  staticness
  root design entity (E'PATH_NAME) vs top design entity (E'INSTANCE_NAME)
  meaning of signature ?
* 10.3 (last paragraph of p 155): 'of a design unit_or' (place of '_').
*B 3.5.1 vs 3.5.2: in examples: VariableSizedBitArray vs VariableSizeBitArray.
* 4.2.2: is a default_expression globally static ?
* 5.1: alias of attribute are allowed ->
  constant obj : bit := '0';
  attribute attr : integer;
  alias attr1 is attr;
  attribute attr of obj : constant is 5;
  ...  obj'attr1 ...
* 5.1: entity designator that denotes an alias .. required to denote the
  entire object.  What means entire ? staticness of entire ?
  constant obj : bit_vector (1 to 3);
  alias obj1 : bit_vector (2 to 4) is obj (1 to 3);
* 8.1:
  process
  begin
     wait for time'high - now;
  end process;
  -> infinite loop or execute only once ?
  (ie does it execute at time'high ?)
*B Does a generate statement have a declarative_part ?
  according to the BNF of 9.7 and glossary -> no
  according to introduction of clause 9 -> yes
  -> does configuration specification applies recursively ?
* Can a design unit be decorated with an attribute specification whose entity
  name list is all/others ? (cf notes of 5.1)
* Can an alias be declared after an all/others attribute specification ?
* Can a named entity be decorated through an alias not declared in the same
  declarative part ?
* Can an anonymous type declaration be decorated ?
*B character literal can be decorated but not referenced.
*B wait on sig (now < 10 ns);
*B pure function can allocate memory and may return different value
*B2 what it the meaning of a name when several non-overloadable declarations
  are visible (one directly, one by selection).
* 'value: only *one* leading/trailing whitespace allowed ?

* libraries:
* V:version, O:option, S:set/standard
* F:file, D:depend, T:time, U:unit, L:location/line
* A:architecture, E:entity, P:package, B:body, C:configuration
* M:module/map (library name to filename), W:with (weak depend), X:translate
* I:instanciated component
* H:homedir
* G J K N Q R Y Z
* + search path, vhdl version, ieee libraries.

* aggregates:
- dynamic bounds -> special case
- bounds are determinated by target
- static bounds and determinated by the aggregate
- static bounds and static values.

BUGS:
* no type descriptor is created for access.  However, a type descriptor is
  created for array and use the type descriptor of its element.  What about
  for array whose element is an access ?

OPTIMIZATIONS:
* for loop whose range is an array index.
* avoid to initialize variable if not read before write.
* avoid stupid range check (ex: a := b, when subtype b = subtype a).

ERROR STORMS:
* complex_tests: real_vector -> real_vectorX