1 | -- Package File Template |
---|
2 | -- |
---|
3 | -- Purpose: This package defines supplemental types, subtypes, |
---|
4 | -- constants, and components |
---|
5 | |
---|
6 | |
---|
7 | library IEEE; |
---|
8 | use IEEE.STD_LOGIC_1164.all; |
---|
9 | use IEEE.numeric_std.all; |
---|
10 | package CoreTypes is |
---|
11 | CONSTANT Word :POSITIVE:= 8; |
---|
12 | CONSTANT ADRLEN:POSITIVE:=16; |
---|
13 | CONSTANT LZFILL :std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');--indique le nombre de zero à utiliser pour completer le bus de données lorsque la longueur restante du bus d'adresse est inférueure à la largeur du bus de données |
---|
14 | CONSTANT IADR0 : NATURAL :=2; --Adresse basse de l'instruction |
---|
15 | CONSTANT IADR1 : natural :=3; |
---|
16 | CONSTANT CORE_BASE_ADR :natural range 0 to 65535:=4096; |
---|
17 | CONSTANT WIN_BASE_ADR :natural range 0 to 65535:=CORE_BASE_ADR+4; |
---|
18 | CONSTANT CORE_UPPER_ADR : natural range 0 to 255:=16; |
---|
19 | CONSTANT CORE_GET_ADR:natural:=CORE_BASE_ADR+526; |
---|
20 | CONSTANT CORE_PUT_ADR :natural:=CORE_BASE_ADR+516; |
---|
21 | CONSTANT core_INIT_ADR : natural:=CORE_BASE_ADR+512; |
---|
22 | CONSTANT CORE_WCREATE_ADR : natural := CORE_BASE_ADR+536; |
---|
23 | CONSTANT CORE_WCOMPL_ADR : natural := CORE_BASE_ADR+546; |
---|
24 | CONSTANT CORE_WPOST_ADR : natural := CORE_BASE_ADR+556; |
---|
25 | CONSTANT CORE_WWAIT_ADR : natural := CORE_BASE_ADR+566; |
---|
26 | CONSTANT CORE_WSYNC_ADR : natural := CORE_BASE_ADR+576; |
---|
27 | CONSTANT CORE_SPAWN_ADR : natural := CORE_BASE_ADR+586; |
---|
28 | CONSTANT CORE_Rank2port_BASE :NATURAL:=52; |
---|
29 | CONSTANT CORE_RANK_ADR : NATURAL:=CORE_BASE_ADR+CORE_Rank2Port_Base; |
---|
30 | CONSTANT WIN0_ADR :natural :=CORE_BASE_ADR+4; |
---|
31 | CONSTANT WIN1_ADR :natural :=CORE_BASE_ADR+20; |
---|
32 | CONSTANT WIN2_ADR :natural :=CORE_BASE_ADR+36; |
---|
33 | CONSTANT WIN3_ADR :natural :=CORE_BASE_ADR+52; |
---|
34 | CONSTANT GETPORTID : std_logic_vector(3 downto 0):="0001"; |
---|
35 | |
---|
36 | type Typ_PortIO is |
---|
37 | array(natural range <>) of std_logic_vector( Word-1 downto 0); |
---|
38 | |
---|
39 | type memory is |
---|
40 | array (natural range <>) of std_logic_vector(word-1 downto 0); |
---|
41 | |
---|
42 | type Core_i is |
---|
43 | record |
---|
44 | Instr_ack :std_logic;-- signal la prise en compte de l'instruction |
---|
45 | Ready :std_logic;-- indique que la dernière fonction est terminée |
---|
46 | InitOk :std_logic; -- l'initialisation est terminée |
---|
47 | Hold_Req :std_logic;--Demande DMA |
---|
48 | RamSel :std_logic;-- indique le statut de la RAM (0 ->dispo 1->occupé par Core_MPI) |
---|
49 | IsMain : std_logic; -- indique si la librairie est principal |
---|
50 | Rank : natural range 0 to 15; --donne le rang du processus courant |
---|
51 | Spawned: std_logic; --indique que ce module a été activé par la bibliothèque |
---|
52 | end record; |
---|
53 | type Core_o is |
---|
54 | record |
---|
55 | Instr_en :std_logic; -- active une instruction MPI |
---|
56 | Hold_Ack :std_logic;-- Autorisation DMA |
---|
57 | MemBusy :std_logic;-- active le refus de DMA (1 -> ignoré la requête DMA de MPI HCL) |
---|
58 | Instruction :std_logic_vector (word-1 downto 0); -- fonction Mpi à exécuter |
---|
59 | end record; |
---|
60 | type core_s is |
---|
61 | record |
---|
62 | Rank : natural range 0 to 15; --donne le rang du processus courant |
---|
63 | IntState1 : natural range 0 to 255; --permet de stocker l'état des MAE interne dans les procédures |
---|
64 | IntState2 : natural range 0 to 255; |
---|
65 | WinId :natural range 0 to 255; --stocke le dernier Id utilisé par WinCreate |
---|
66 | GPost : std_logic_vector(15 downto 0); --etat de la fenêtre active |
---|
67 | GStart : std_logic_vector(15 downto 0); |
---|
68 | tmem : memory(0 to 3); --petite mémoire tampon pour stocker les variables statiques des MVPs |
---|
69 | end record; |
---|
70 | type core_io is |
---|
71 | record |
---|
72 | I:core_i; --les entrées |
---|
73 | O:core_o; --les sorties |
---|
74 | S:core_s; --les signaux temporaires |
---|
75 | end record; |
---|
76 | |
---|
77 | type Core_io_old is |
---|
78 | record |
---|
79 | Instr_en :std_logic; -- active une instruction MPI |
---|
80 | Instr_ack :std_logic;-- signal la prise en compte de l'instruction |
---|
81 | Ready :std_logic;-- indique que la dernière fonction est terminée |
---|
82 | InitOk :std_logic; -- l'initialisation est terminée |
---|
83 | Hold_Req :std_logic;--Demande DMA |
---|
84 | Hold_Ack :std_logic;-- Autorisation DMA |
---|
85 | MemBusy :std_logic;-- active le refus de DMA (1 -> ignoré la requête DMA) |
---|
86 | RamSel :std_logic;-- indique le statut de la RAM (0 ->dispo 1->occupé par Core_MPI) |
---|
87 | IntState1 : natural range 0 to 255; --permet de stocker l'état des MAE interne dans les procédures |
---|
88 | IntState2 : natural range 0 to 255; |
---|
89 | Instruction :std_logic_vector (word-1 downto 0); |
---|
90 | WinId :natural range 0 to 255; --stocke le dernier Id utilisé par WinCreate |
---|
91 | IsMain : std_logic; -- indique si la librairie est principal |
---|
92 | Rank : natural range 0 to 15; --donne le rang du processus courant |
---|
93 | Spawned: std_logic; --indique que ce module a été activé par la bibliothèque |
---|
94 | end record; |
---|
95 | |
---|
96 | type typ_dpram_i is |
---|
97 | record |
---|
98 | data_out : STD_LOGIC_VECTOR (Word-1 downto 0); |
---|
99 | |
---|
100 | end record; |
---|
101 | type typ_dpram_o is |
---|
102 | record |
---|
103 | clk_wr : STD_LOGIC; |
---|
104 | clk_rd : STD_LOGIC; |
---|
105 | we : STD_LOGIC; |
---|
106 | ena : STD_LOGIC; |
---|
107 | enb : STD_LOGIC; |
---|
108 | addr_wr: STD_LOGIC_VECTOR (ADRLEN-1 downto 0); |
---|
109 | addr_rd : STD_LOGIC_VECTOR (ADRLEN-1 downto 0); |
---|
110 | data_in : STD_LOGIC_VECTOR (Word-1 downto 0); |
---|
111 | end record; |
---|
112 | type typ_dpram is |
---|
113 | record |
---|
114 | O : typ_dpram_o; |
---|
115 | I : typ_dpram_I; |
---|
116 | end record; |
---|
117 | type Typ_MPIPort_in is |
---|
118 | record |
---|
119 | instruction : STD_LOGIC_VECTOR (Word -1 downto 0); |
---|
120 | instruction_en : STD_LOGIC; |
---|
121 | |
---|
122 | |
---|
123 | packet_ack : std_logic; |
---|
124 | ram_data_out : STD_LOGIC_VECTOR (Word-1 downto 0); |
---|
125 | |
---|
126 | hold_ack : STD_Logic; --autorisation par l'application |
---|
127 | clk : STD_LOGIC; |
---|
128 | reset : STD_LOGIC; |
---|
129 | |
---|
130 | end record; |
---|
131 | type Typ_MPIPort_out is |
---|
132 | record |
---|
133 | |
---|
134 | |
---|
135 | ram_we : STD_LOGIC; |
---|
136 | ram_en : STD_LOGIC; |
---|
137 | ram_data_in : STD_LOGIC_VECTOR (WORD-1 downto 0); |
---|
138 | ram_address_rd : STD_LOGIC_VECTOR (ADRLEN-1 downto 0); |
---|
139 | ram_address_wr : STD_LOGIC_VECTOR (ADRLEN-1 downto 0); |
---|
140 | packet_received : STD_LOGIC; |
---|
141 | barrier_completed : STD_LOGIC; |
---|
142 | instruction_fifo_full : STD_LOGIC; |
---|
143 | PushOut : STD_LOGIC_VECTOR (WORD-1 downto 0); |
---|
144 | |
---|
145 | hold_req : STD_Logic; --requete vers application |
---|
146 | end record; |
---|
147 | |
---|
148 | Type Ar_MPIPort_In is array (positive range <>) of Typ_MPIPort_in; |
---|
149 | Type Ar_MPIPort_out is array (positive range <>) of Typ_MPIPort_out; |
---|
150 | type ar_DpRam is array (natural range <>) of typ_dpRam; |
---|
151 | -- Declare constants |
---|
152 | |
---|
153 | -- constant <constant_name> : time := <time_unit> ns; |
---|
154 | -- constant <constant_name> : integer := <value>; |
---|
155 | -- |
---|
156 | -- Declare functions and procedure |
---|
157 | Component SWITCH_GEN is |
---|
158 | generic(number_of_ports : positive := 8); |
---|
159 | port( |
---|
160 | -- ports d'entree |
---|
161 | Port_in : in typ_portIO(1 to number_of_ports) ; |
---|
162 | -- |
---|
163 | |
---|
164 | -- port de sortie |
---|
165 | Port_out : out typ_portIO(1 to number_of_ports); |
---|
166 | -- |
---|
167 | -- signaux de controle |
---|
168 | cmd_in_en : in std_logic_vector(number_of_ports downto 1); |
---|
169 | data_in_en : in std_logic_vector(number_of_ports downto 1); |
---|
170 | data_out_en : in std_logic_vector(number_of_ports downto 1); |
---|
171 | fifo_in_full : out std_logic_vector(number_of_ports downto 1); |
---|
172 | fifo_in_empty : out std_logic_vector(number_of_ports downto 1); |
---|
173 | data_available : out std_logic_vector(number_of_ports downto 1); |
---|
174 | clk : in STD_LOGIC; |
---|
175 | reset : in STD_LOGIC); |
---|
176 | end component SWITCH_GEN; |
---|
177 | -- déclaration des fonctions utilisées |
---|
178 | --functions d'initialisation |
---|
179 | -- |
---|
180 | function init_core_i return Core_i; |
---|
181 | function init_core_o return Core_o; |
---|
182 | function init_core_s return Core_s; |
---|
183 | function init_core_io return Core_io; |
---|
184 | function init_dpRam return Typ_dpRam; |
---|
185 | --***************************************************** |
---|
186 | FUNCTION all_ones(s1:std_logic_vector) return std_logic; |
---|
187 | --This function returns if the input vector has all ones and no zeros |
---|
188 | FUNCTION all_zeros(s1:std_logic_vector) return std_logic; |
---|
189 | --This function returns if the input vector has all zeros and no ones |
---|
190 | FUNCTION incr_vec(s1:std_logic_vector;en:std_logic) return std_logic_vector; |
---|
191 | --This function increments an std_logic_vector type by '1', without |
---|
192 | --using any arithmatic |
---|
193 | |
---|
194 | FUNCTION dcr_vec(s1:std_logic_vector;en:std_logic) return std_logic_vector; |
---|
195 | --This function decrements an std_logic_vector type by '1', without |
---|
196 | --using any arithmatic |
---|
197 | FUNCTION Rol_Vec(s1:std_logic_vector) return std_logic_vector; |
---|
198 | --renvoie un std_logic_vector de taille ADRLEN |
---|
199 | Function Stdlv (s1 : natural) return std_logic_vector; |
---|
200 | --renvoie un std_logic_vector de taille width |
---|
201 | Function Stdlv (s1 : natural;width:positive ) return std_logic_vector; |
---|
202 | function image(L: bit_vector) return String; |
---|
203 | function image(L: bit) return String; |
---|
204 | function image(L: std_logic_vector) return String; |
---|
205 | function image(L: std_logic) return String; |
---|
206 | function Hex_to_Ascii(l : std_logic_vector(3 downto 0))return std_logic_vector; |
---|
207 | -- function HexImage(L: unsigned) return String; |
---|
208 | -- function HexImage(L: signed) return String; |
---|
209 | -- function HexImage(L: std_ulogic_vector) return String; |
---|
210 | -- function HexImage(L: std_logic_vector) return String; |
---|
211 | -- function HexImage(L: bit_vector) return String; |
---|
212 | end CoreTypes; |
---|
213 | |
---|
214 | |
---|
215 | Package body CoreTypes is |
---|
216 | |
---|
217 | |
---|
218 | FUNCTION incr_vec(s1:std_logic_vector;en:std_logic) return std_logic_vector is |
---|
219 | --this function increments a std_logic_vector type by '1' |
---|
220 | VARIABLE V : std_logic_vector(s1'high downto s1'low) ; |
---|
221 | VARIABLE tb : std_logic_vector(s1'high downto s1'low); |
---|
222 | BEGIN |
---|
223 | tb(s1'low) := en; |
---|
224 | V := s1; |
---|
225 | for i in (V'low + 1) to V'high loop |
---|
226 | tb(i) := V(i - 1) and tb(i -1); |
---|
227 | end loop; |
---|
228 | for i in V'low to V'high loop |
---|
229 | if(tb(i) = '1') then |
---|
230 | V(i) := not(V(i)); |
---|
231 | end if; |
---|
232 | end loop; |
---|
233 | return V; |
---|
234 | end incr_vec; -- end function |
---|
235 | |
---|
236 | FUNCTION dcr_vec(s1:std_logic_vector;en:std_logic) return std_logic_vector is |
---|
237 | --this function decrements a std_logic_vector type by '1' |
---|
238 | VARIABLE V : std_logic_vector(s1'high downto s1'low) ; |
---|
239 | VARIABLE tb : std_logic_vector(s1'high downto s1'low); |
---|
240 | BEGIN |
---|
241 | tb(s1'low) := not(en); |
---|
242 | V := s1; |
---|
243 | for i in (V'low + 1) to V'high loop |
---|
244 | tb(i) := V(i - 1) or tb(i -1); |
---|
245 | end loop; |
---|
246 | for i in V'low to V'high loop |
---|
247 | if(tb(i) = '0') then |
---|
248 | V(i) := not(V(i)); |
---|
249 | end if; |
---|
250 | end loop; |
---|
251 | return V; |
---|
252 | end dcr_vec; -- end function |
---|
253 | FUNCTION all_ones(s1:std_logic_vector) return std_logic is |
---|
254 | --this function tells if all bits of a vector are '1' |
---|
255 | --return value Z is '1', then vector has all 1 bits |
---|
256 | --VARIABLE V : std_logic_vector(s1'high downto s1'low) ; |
---|
257 | VARIABLE Z : std_logic; |
---|
258 | BEGIN |
---|
259 | Z := s1(s1'low); |
---|
260 | FOR i IN (s1'low+1) to s1'high LOOP |
---|
261 | Z := Z AND s1(i); |
---|
262 | END LOOP; |
---|
263 | RETURN Z; |
---|
264 | END all_ones; -- end function |
---|
265 | FUNCTION all_zeros(s1:std_logic_vector) return std_logic is |
---|
266 | --this function tells if all bits of a vector are '0' |
---|
267 | --return value Z if '1', then vector has all 0 bits |
---|
268 | --VARIABLE V : std_logic_vector(s1'high downto s1'low) ; |
---|
269 | VARIABLE Z : std_logic; |
---|
270 | BEGIN |
---|
271 | Z := '0'; |
---|
272 | FOR i IN (s1'low) to s1'high LOOP |
---|
273 | Z := Z OR s1(i); |
---|
274 | END LOOP; |
---|
275 | RETURN not(Z); |
---|
276 | END all_zeros; -- end function |
---|
277 | |
---|
278 | FUNCTION Rol_Vec(s1:std_logic_vector) return std_logic_vector is |
---|
279 | --cette fonction fait roter un STD_logic d'un pas vers la gauche |
---|
280 | VARIABLE V : std_logic_vector(s1'high downto s1'low) ; |
---|
281 | VARIABLE lb : std_logic :=s1(s1'left); |
---|
282 | BEGIN |
---|
283 | |
---|
284 | for i in V'left downto (V'right+1) loop |
---|
285 | V(i) := s1(i - 1) ; |
---|
286 | end loop; |
---|
287 | V(V'right):=lb; |
---|
288 | return V; |
---|
289 | end Rol_vec; |
---|
290 | Function Stdlv (s1 : natural ) return std_logic_vector is |
---|
291 | VARIABLE V : std_logic_vector(ADRLEN-1 downto 0); |
---|
292 | begin |
---|
293 | V:=std_logic_vector(to_unsigned(s1,ADRLEN)); |
---|
294 | return V; |
---|
295 | end stdlv; |
---|
296 | Function Stdlv (s1 : natural;width:positive ) return std_logic_vector is |
---|
297 | VARIABLE V : std_logic_vector(width-1 downto 0); |
---|
298 | begin |
---|
299 | V:=std_logic_vector(to_unsigned(s1,width)); |
---|
300 | return V; |
---|
301 | end stdlv; |
---|
302 | |
---|
303 | -- Start of heximage functions |
---|
304 | --function HexImage(L: bit_vector) return String is |
---|
305 | --begin |
---|
306 | --return(HexImage(imge(L))); |
---|
307 | --end function HexImage; |
---|
308 | -- |
---|
309 | --function HexImage(L: std_ulogic_vector) return String is |
---|
310 | --begin |
---|
311 | --return(HexImage(image(to_x01(L)))); |
---|
312 | --end function HexImage; |
---|
313 | |
---|
314 | --function HexImage(L: std_logic_vector) return String is |
---|
315 | --begin |
---|
316 | --return(HexImage(imge(to_x01(L)))); |
---|
317 | --end function HexImage; |
---|
318 | -- |
---|
319 | --function HexImage(L: signed) return String is |
---|
320 | --begin |
---|
321 | --return(HexImage(imge(L))); |
---|
322 | --end function HexImage; |
---|
323 | -- |
---|
324 | --function HexImage(L: unsigned) return String is |
---|
325 | --begin |
---|
326 | --return(HexImage(image(L))); |
---|
327 | --end function HexImage; |
---|
328 | -- End of heximage functions |
---|
329 | -- Start of an example image function |
---|
330 | function Hex_to_Ascii(l : std_logic_vector(3 downto 0)) return std_logic_vector is |
---|
331 | variable he:std_logic_vector(7 downto 0); |
---|
332 | variable val : unsigned(7 downto 0); |
---|
333 | begin |
---|
334 | val:= unsigned(X"0" & unsigned(l)); |
---|
335 | |
---|
336 | if val<10 then |
---|
337 | he:=std_logic_vector(val+48); |
---|
338 | else |
---|
339 | he:=std_logic_vector(val+55); |
---|
340 | end if; |
---|
341 | return he; |
---|
342 | end function; |
---|
343 | function image(L: bit) return String is |
---|
344 | variable bit_image: String(1 to 1) := bit'image(L); |
---|
345 | begin |
---|
346 | return(bit_image(1 to 1)); |
---|
347 | end function image; |
---|
348 | |
---|
349 | |
---|
350 | function image(L: std_logic) return String is |
---|
351 | variable bit_image: String(1 to 3) := std_logic'image(L); |
---|
352 | begin |
---|
353 | return(bit_image(1 to 1)); |
---|
354 | end function image; |
---|
355 | |
---|
356 | function image(L: bit_vector) return String is |
---|
357 | variable Lx: bit_vector(1 to L'length); |
---|
358 | variable RetVal: String(1 to L'length); |
---|
359 | begin |
---|
360 | Lx := L; |
---|
361 | for i in Lx'range loop |
---|
362 | RetVal(i to i) := image(Lx(i)); |
---|
363 | end loop; |
---|
364 | return(RetVal); |
---|
365 | end function image; |
---|
366 | |
---|
367 | |
---|
368 | function image(L: std_logic_vector) return String is |
---|
369 | variable Lx: std_logic_vector(1 to L'length); |
---|
370 | variable RetVal: String(1 to L'length); |
---|
371 | begin |
---|
372 | Lx := L; |
---|
373 | for i in Lx'range loop |
---|
374 | RetVal(i to i) := image(Lx(i)); |
---|
375 | end loop; |
---|
376 | return(RetVal); |
---|
377 | end function image; |
---|
378 | --*************************************************** |
---|
379 | --functions d'initialisation |
---|
380 | function init_memory(size : natural;val :std_logic_vector(Word-1 downto 0):=(others=>'0')) return memory is |
---|
381 | variable dt: memory(0 to size-1); |
---|
382 | begin |
---|
383 | for i in 0 to size-1 loop |
---|
384 | dt(i):=val; |
---|
385 | end loop; |
---|
386 | return dt; |
---|
387 | end function; |
---|
388 | function init_DpRam return typ_dpram is |
---|
389 | variable sram : typ_dpRam; |
---|
390 | |
---|
391 | begin |
---|
392 | sram.I.data_out :=(others=>'0'); |
---|
393 | sram.o.clk_wr :='0'; |
---|
394 | sram.o.clk_rd :='0'; |
---|
395 | sram.o.we :='0'; |
---|
396 | sram.o.ena :='0'; |
---|
397 | sram.o.enb :='0'; |
---|
398 | sram.o.addr_wr:=(others=>'0'); |
---|
399 | sram.o.addr_rd:=(others=>'0'); |
---|
400 | sram.o.data_in:=(others=>'0'); |
---|
401 | |
---|
402 | return sram; |
---|
403 | end function; |
---|
404 | |
---|
405 | function init_core_i return Core_i is |
---|
406 | variable coreI : Core_i; |
---|
407 | begin |
---|
408 | |
---|
409 | corei.Instr_ack :='0'; -- signal la prise en compte de l'instruction |
---|
410 | corei.Ready :='0';-- indique que la dernière fonction est terminée |
---|
411 | corei.InitOk :='0'; -- l'initialisation est terminée |
---|
412 | corei.Hold_Req :='0';--Demande DMA |
---|
413 | corei.RamSel :='0';-- indique le statut de la RAM (0 ->dispo 1->occupé par Core_MPI) |
---|
414 | corei.IsMain :='0'; -- indique si la librairie est principal |
---|
415 | corei.Rank :=0; --donne le rang du processus courant |
---|
416 | corei.Spawned:='0'; --indique que ce module a été activé par la bibliothèque |
---|
417 | return (corei); |
---|
418 | end function; |
---|
419 | function init_core_o return Core_o is |
---|
420 | variable coreO : Core_o; |
---|
421 | begin |
---|
422 | coreo.Instr_en :='0'; -- active une instruction MPI |
---|
423 | coreo.Hold_Ack :='0';-- Autorisation DMA |
---|
424 | coreo.MemBusy :='0';-- active le refus de DMA (1 -> ignoré la requête DMA de MPI HCL) |
---|
425 | coreo.Instruction :=(others=>'0'); -- fonction Mpi à exécuter |
---|
426 | return coreo; |
---|
427 | end function; |
---|
428 | function init_core_s return Core_s is |
---|
429 | |
---|
430 | variable coreS : Core_s; |
---|
431 | begin |
---|
432 | cores.Rank :=0; --donne le rang du processus courant |
---|
433 | cores.IntState1 :=0; --permet de stocker l'état des MAE interne dans les procédures |
---|
434 | cores.IntState2 :=0; |
---|
435 | cores.WinId :=0; --stocke le dernier Id utilisé par WinCreate |
---|
436 | cores.GPost :=(others=>'0'); --etat de la fenêtre active |
---|
437 | cores.GStart :=(others=>'0'); |
---|
438 | cores.tmem :=init_memory(4); --petite mémoire tampon pour stocker les variables statiques des MVPs |
---|
439 | return Cores ; |
---|
440 | end function; |
---|
441 | function init_core_io return Core_io is |
---|
442 | variable coreIO : Core_io; |
---|
443 | begin |
---|
444 | CoreIO.O:=init_core_o; |
---|
445 | CoreIO.I:=Init_Core_I; |
---|
446 | CoreIO.S:=Init_Core_S; |
---|
447 | return CoreIO; |
---|
448 | end function; |
---|
449 | |
---|
450 | end CoreTypes; |
---|