source: PROJECT_CORE_MPI/CORE_MPI/BRANCHES/v0.01/MPI_RMA.vhd

Last change on this file was 39, checked in by rolagamo, 12 years ago
File size: 31.4 KB
Line 
1--      Package File Template
2--
3--      Purpose: This package defines supplemental types, subtypes,
4--               constants, and functions
5
6
7library IEEE;
8use IEEE.STD_LOGIC_1164.all;
9use ieee.numeric_std.all;
10use IEEE.STD_LOGIC_ARITH.ALL;
11use IEEE.STD_LOGIC_UNSIGNED.ALL;
12Library NocLib;
13use NocLib.CoreTypes.all;
14use work.PACKET_TYPE.all;
15
16package Mpi_Rma is
17procedure WritePtr(AdrVect:in std_logic_vector; count: inout natural;signal SysRam :out typ_dpram);
18procedure pMPI_INIT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram);
19procedure pMPI_PUT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
20 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
21  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
22  Target_Datatype :natural; Win : natural);
23
24procedure pMPI_GET(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
25 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
26  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
27  Target_Datatype :natural; Win : natural);
28procedure pMPI_Comm_Rank(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; COMM :in natural; signal Rank : out std_logic_vector );
29
30procedure pMPI_Win_create(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
31                                                                        base :std_logic_vector; size : Mpi_Aint;disp_unit:natural; 
32                                                                        info:natural; comm:Mpi_Comm; Win: inout MPI_Win );
33procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
34-- declare functions and procedure       
35 procedure ReadMem(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
36                                                AdrVect:in std_logic_vector; data: out std_logic_vector);
37procedure WriteMem(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
38                                                AdrVect:in std_logic_vector; Data:in std_logic_vector);                                         
39end MPI_Rma;
40
41
42package body MPI_Rma is
43----int MPI_Put(
44--  void *origin_addr,
45--  int origin_count,
46--  MPI_Datatype origin_datatype,
47--  int target_rank,
48--  MPI_Aint target_disp,
49--  int target_count,
50--  MPI_Datatype target_datatype,
51--  MPI_Win win
52--);
53-- Example 1
54procedure pMPI_PUT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
55 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
56  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
57  Target_Datatype :natural; Win : natural) is
58variable i,dcount : natural:=0;
59variable adresse :natural;
60variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
61variable addr2 :std_logic_vector(Target_Disp'length-1 downto 0):=Target_Disp;
62variable put_adr : std_logic_vector (ADRLEN-1 downto 0);
63variable config_reg: std_logic_vector (Word-1 downto 0);
64constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
65        begin   
66                                put_adr:=Std_logic_vector(to_unsigned(Core_put_adr,ADRLEN));
67                               
68                                addr1:=Orig_Addr;
69                                addr2:=Target_Disp;
70                                if NextCtx /=0 then --préserver la valeur de count entre les appels
71                                dcount:=NextCtx;
72                                end if;
73--                                     
74                                       
75                                if rising_edge(clkin) then             
76                                                        if dcount>=0 and dcount <=3 then 
77                                                                        if interf.ramsel='0' then
78                                                                                        SysRam.we<='1';
79                                                                                        SysRam.ena<='1';
80                                                                                        SysRam.enb<='0';
81                                                                                        WritePtr (put_adr,dcount,SysRam);
82                                                                                        if dcount =4 then 
83                                                                                                -- fin de l'écriture du pointeur en mémoire
84                                                                                        end if;                                                         
85                                                                        end if;
86                                                       
87                                                        elsif dcount=4 then
88                                                        if interf.ramsel='0' then
89                                                                SysRam.we<='1';
90                                                                SysRam.ena<='1';
91                                                                SysRam.enb<='0';
92                                                                adresse:=core_put_adr;
93                                                                sysRam.Data_in<=MPI_PUT & std_logic_vector(to_unsigned(Target_Rank,4)); --code fonction
94                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
95                                                                dcount:=dcount+1;
96                                                        end if;
97                                                        elsif dcount=5 then 
98                                                                if interf.ramsel='0' then
99                                                                adresse:=core_put_adr+1;
100                                                                sysRam.Data_in<=std_logic_vector(to_unsigned(Orig_Count,8)) ;--la longueur
101                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
102                                                                dcount:=dcount+1;
103                                                                end if;
104                                                        elsif dcount=6 then
105                                                                if interf.ramsel='0' then
106                                                                adresse:=core_put_adr+2;
107                                                                sysRam.Data_in<= Addr1(ADRLEN-1 downto Word) ; --source Haut
108                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
109                                                                dcount:=dcount+1;
110                                                                end if;
111                                                        elsif dcount=7 then
112                                                                if interf.ramsel='0' then
113                                                                adresse:=core_put_adr+3;
114                                                                sysRam.Data_in<=Addr1(Word-1 downto 0);  --source Bas
115                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
116                                                                dcount:=dcount+1;
117                                                                end if;
118                                                        elsif dcount=8 then
119                                                                if interf.ramsel='0' then
120                                                                adresse:=core_put_adr+4;
121                                                                sysRam.Data_in<= Addr2(ADRLEN-1 downto Word) ; -- destination haut
122                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
123                                                                dcount:=dcount+1;
124                                                                end if;
125                                                        elsif dcount=9 then
126                                                                if interf.ramsel='0' then
127                                                                adresse:=core_put_adr+5;
128                                                                sysRam.Data_in<=Addr2(Word-1 downto 0); -- destination bas
129                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
130                                                                dcount:=dcount+1;
131                                                                end if;
132                                                        elsif dcount=10 then
133                                                               
134                                                                SysRam.we<='1';
135                                                                SysRam.ena<='1';
136                                                                SysRam.enb<='1';
137                                                                if interf.ramsel='0' then
138                                                                adresse:=core_base_adr+1;
139                                                                SysRam.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
140                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
141                                                                sysRam.Data_in<=x"01"; --instruction pulse enable via la mémoire;
142                                                                Interf.Instr_En<='1'; --active la prise en compte de l'instruction
143                                                                dcount:=dcount+1;
144                                                                end if;
145                                                        elsif dcount=11 then
146                                                                if Interf.Instr_ack='1' then -- le Core a reçu l'instruction ?
147                                                                        Interf.Instr_En<='0';   --désactiver la prise en compte de l'instruction
148                                                                        dcount:=dcount+1;
149                                                                        config_reg:=SysRam.data_out and x"f6";
150                                                                        SysRam.Data_in<=config_reg ; --ramener le IPulse à 0;
151                                                                end if;
152                                                                        adresse:=core_base_adr+1;
153                                                                        SysRam.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
154                                                                        SysRam.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
155                                                                        --SysRam.Ram_busy<='0'; --??
156                                                                        SysRam.we<='0';
157                                                                        SysRam.ena<='0';  -- préparer la lecture du résultat du Put
158                                                                        SysRam.enb<='1';                                               
159                                                        elsif dcount=12 then
160                                                                        adresse:=core_base_adr+1;
161                                                                        SysRam.we<='1';
162                                                                        SysRam.ena<='1';  -- préparer l'écriture du résultat du Put
163                                                                        SysRam.enb<='1';
164                                                                        if interf.ramsel='0' then
165                                                                        config_reg:=SysRam.data_out and x"f6";
166                                                                        SysRam.Data_in<=config_reg ; --ramener le IPulse à 0;
167                                                                        dcount:=dcount+1;
168                                                                        end if;
169                                                                        SysRam.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
170                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
171                                                        elsif dcount=13 then
172                                                                        SysRam.we<='1';
173                                                                        SysRam.ena<='1';  -- préparer l'écriture du résultat du Put
174                                                                        SysRam.enb<='0';
175                                                                        config_reg:=SysRam.data_out and x"f6";
176                                                                        SysRam.Data_in<=config_reg ; --ramener le IPulse à 0;
177                                                                        dcount:=dcount+1;
178                                                                        adresse:=core_base_adr+1;
179                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
180                                                        elsif dcount=14 then   
181                                                                        SysRam.we<='0';
182                                                                        SysRam.ena<='0';
183                                                                        SysRam.enb<='1';
184                                                                        if Interf.RamSel='0' then 
185                                                                                SysRam.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+6,Adrlen));
186                                                                                if SysRam.Data_out(0)='1' then --fin du MPI PUT ici pour l'envoie !
187                                                                                        dcount:=dcount+1;
188                                                                                end if;
189                                                                        end if;
190                                                        elsif dcount=15 then   
191                                                                        dcount:=0; --fin normale de la fonction
192                                                        end if;
193                                                       
194                                                       
195                                                  NExtCtx:=dcount;
196                                end if;
197        end procedure;
198
199procedure pMPI_GET(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
200 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
201  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
202  Target_Datatype :natural; Win : natural) is
203variable i,wcount,dcount : natural range 0 to 255:=0;
204variable adresse :natural;
205variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
206variable addr2 :std_logic_vector(Target_Disp'length-1 downto 0):=Target_Disp;
207variable get_adr : std_logic_vector (ADRLEN-1 downto 0);
208variable config_reg: std_logic_vector (Word-1 downto 0);
209constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
210        begin   
211                                get_adr:=Std_logic_vector(to_unsigned(Core_get_adr,ADRLEN));
212                               
213                                addr1:=Orig_Addr;
214                                addr2:=Target_Disp;
215                                if NextCtx /=0 then --préserver la valeur de count entre les appels
216                                dcount:=NextCtx;
217                                end if;
218--                                     
219                                       
220                                if rising_edge(clkin) then             
221                                                       
222                                                if dcount =0 then       
223                                                        dcount:=dcount+1;
224                                                elsif dcount>=1 and dcount <=3 then 
225                                                                        if interf.ramsel='0' then
226                                                                                        SysRam.we<='1';
227                                                                                        SysRam.ena<='1';
228                                                                                        SysRam.enb<='0';
229                                                                                        wcount:=interf.intstate1;
230                                                                                        WritePtr (get_adr,wcount,SysRam);
231                                                                                        interf.intstate1<=wcount;
232                                                                                        if wcount =0 then 
233                                                                                                dcount:=4;
234                                                                                        end if;                                                         
235                                                                        end if;
236                                                       
237                                                        elsif dcount=4 then
238                                                        if Interf.RamSel='0' then 
239                                                                SysRam.we<='1';
240                                                                SysRam.ena<='1';
241                                                                SysRam.enb<='0';
242                                                                adresse:=core_get_adr;
243                                                                sysRam.Data_in<=MPI_GET & std_logic_vector(to_unsigned(Target_Rank,4)); --code fonction
244                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
245                                                               
246                                                                dcount:=dcount+1;
247                                                        end if;
248                                                        elsif dcount=5 then 
249                                                                if Interf.RamSel='0' then       
250                                                                        SysRam.we<='1';
251                                                                        SysRam.ena<='1';
252                                                                        adresse:=core_get_adr+1;
253                                                                        sysRam.Data_in<=std_logic_vector(to_unsigned(Orig_Count,8)) ;--la longueur
254                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
255                                                               
256                                                                        dcount:=dcount+1;
257                                                                end if; 
258                                                        elsif dcount=6 then
259                                                                if Interf.RamSel='0' then 
260                                                                        SysRam.we<='1';
261                                                                        SysRam.ena<='1';
262                                                                        adresse:=core_get_adr+2;
263                                                                        sysRam.Data_in<= Addr1(ADRLEN-1 downto Word) ; --source Haut
264                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
265                                                                       
266                                                                        dcount:=dcount+1;
267                                                                else
268                                                                        dcount:=dcount-1;
269                                                                end if;
270                                                        elsif dcount=7 then
271                                                                if Interf.RamSel='0' then
272                                                                        SysRam.we<='1';
273                                                                        SysRam.ena<='1';
274                                                                        adresse:=core_get_adr+3;
275                                                                        sysRam.Data_in<=Addr1(Word-1 downto 0);  --source Bas
276                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
277                                                                       
278                                                                        dcount:=dcount+1;
279                                                                else
280                                                                        dcount:=dcount-1;
281                                                                end if;
282                                                        elsif dcount=8 then
283                                                                if Interf.RamSel='0' then 
284                                                                        SysRam.we<='1';
285                                                                        SysRam.ena<='1';                                       
286                                                                        adresse:=core_get_adr+4;
287                                                                        sysRam.Data_in<= Addr2(ADRLEN-1 downto Word) ; -- destination haut
288                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
289                                                               
290                                                                        dcount:=dcount+1;
291                                                                else
292                                                                        dcount:=dcount-1;
293                                                                end if;
294                                                        elsif dcount=9 then
295                                                                if Interf.RamSel='0' then
296                                                                        SysRam.we<='1';
297                                                                        SysRam.ena<='1';
298                                                                        adresse:=core_get_adr+5;
299                                                                        sysRam.Data_in<=Addr2(Word-1 downto 0); -- destination bas
300                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
301                                                                 
302                                                                        dcount:=dcount+1;
303                                                                end if;
304                                                        elsif dcount=10 then
305                                                                 
306                                                                        SysRam.we<='1';
307                                                                        SysRam.ena<='1';
308                                                                        SysRam.enb<='1';
309                                                                        adresse:=core_base_adr+1;
310                                                                        SysRam.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
311                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
312                                                                        sysRam.Data_in<=x"01"; --instruction pulse enable via la mémoire;
313                                                                        Interf.Instr_En<='1'; --active la prise en compte de l'instruction
314                                                                if Interf.RamSel='0' then
315                                                                        dcount:=dcount+1;
316                                                                end if;
317                                                        elsif dcount=11 then
318                                                                if Interf.Instr_ack='1' then -- le Core a reçu l'instruction ?
319                                                                        Interf.Instr_En<='0';   --désactiver la prise en compte de l'instruction
320                                                                        dcount:=dcount+1;
321                                                                        config_reg:=SysRam.data_out and x"f6";
322                                                                        SysRam.Data_in<=config_reg ; --ramener le IPulse à 0;
323                                                                end if;
324                                                                        adresse:=core_base_adr+1;
325                                                                        SysRam.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
326                                                                        SysRam.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
327                                                                        --SysRam.Ram_busy<='0'; --??
328                                                                        SysRam.we<='0';
329                                                                        SysRam.ena<='0';  -- préparer la lecture du résultat du get
330                                                                        SysRam.enb<='1';                                               
331                                                        elsif dcount=12 then
332                                                               
333                                                                        adresse:=core_base_adr+1;
334                                                                        SysRam.we<='1';
335                                                                        SysRam.ena<='1';  -- préparer l'écriture du résultat du get
336                                                                        SysRam.enb<='1';
337                                                                if Interf.RamSel='0' then       
338                                                                        config_reg:=SysRam.data_out and x"f6";
339                                                                        SysRam.Data_in<=config_reg ; --ramener le IPulse à 0;
340                                                                        dcount:=dcount+1;
341                                                                end if;
342                                                                        SysRam.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
343                                                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
344                                                               
345                                                        elsif dcount=13 then
346                                                                         
347                                                                                SysRam.we<='1';
348                                                                                SysRam.ena<='1';  -- préparer l'écriture du résultat du GET
349                                                                                SysRam.enb<='0';
350                                                                                adresse:=core_base_adr+1;
351                                                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
352                                                                        if Interf.RamSel='0' then
353                                                                                config_reg:=SysRam.data_out and x"f6";
354                                                                                SysRam.Data_in<=config_reg ; --ramener le IPulse à 0;
355                                                                                dcount:=dcount+1;
356                                                                               
357                                                                        end if;
358                                                        elsif dcount=14 then   
359                                                                        SysRam.we<='0';
360                                                                        SysRam.ena<='0';
361                                                                        SysRam.enb<='1';
362                                                                        if Interf.RamSel='0' then 
363                                                                                SysRam.addr_rd<=Std_logic_vector(to_unsigned(Core_get_adr+6,Adrlen));
364                                                                                if SysRam.Data_out(0)='1' then --fin du MPI get ici pour l'envoie !
365                                                                                        dcount:=dcount+1;
366                                                                                end if;
367                                                                        end if;
368                                                        elsif dcount=15 then   
369                                                                        dcount:=0; --fin normale de la fonction
370                                                        end if;
371                                                       
372                                                       
373                                                  NExtCtx:=dcount;
374                        end if; 
375        end procedure; 
376Procedure pMPI_Comm_group(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam : inout typ_dpram; COMM :in MPI_Comm; signal grp : out Mpi_group ) is 
377Begin
378--cette procédure permet de récupérer le groupe qui est associé à un communicateur
379--dans notre cas c'est la récupération du groupe associé à COMM_WORLD
380end procedure;
381--int MPI_Group_incl(MPI_Group group, int n, int *ranks,
382--    MPI_Group *newgroup)
383Procedure pMPI_group_incl(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam : inout typ_dpram;
384                                                                        GRP: Mpi_group; n:natural;ranks :natural; newgroup: out Mpi_group) is
385Begin
386-- cette procedure a pour algo de parcourir les rangs qui sont dans la mémoire pointée par ranks
387-- et d'activer l'un des  bits de position de newgroup.
388--
389--
390end procedure;
391                                                               
392procedure pMPI_Comm_Rank(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; COMM :in natural; signal Rank : out std_logic_vector ) is
393variable adresse_rd : natural range 0 to 2**ADRLEN-1;   
394
395begin
396
397                if NextCtx =0 then
398                        SysRam.we<='0';
399                        SysRam.ena<='0';
400                        SysRam.enb<='1';
401                        adresse_rd:=CORE_INIT_ADR+1;
402                        sysRam.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
403                       
404                                NextCtx:=1;
405               
406                elsif NextCtx=1 then
407                        SysRam.we<='0';
408                        SysRam.ena<='0';
409                        SysRam.enb<='1';
410                        adresse_rd:=CORE_INIT_ADR+1;
411                        sysRam.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
412                        if Interf.Ramsel='0' then
413                                Rank<=SysRam.Data_out(3 downto 0);
414                                NextCtx:=2;
415                        end if; 
416                elsif NextCtx=2 then
417                        SysRam.we<='0';
418                        SysRam.ena<='0';
419                        SysRam.enb<='1';
420                        adresse_rd:=CORE_INIT_ADR+1;
421                        sysRam.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
422                        if Interf.Ramsel='0' then
423                                Rank<=SysRam.Data_out(3 downto 0);
424                                NextCtx:=3;
425                        end if; 
426                elsif NextCtx=3 then
427                        SysRam.we<='0';
428                        SysRam.ena<='0';
429                        SysRam.enb<='1';
430                        adresse_rd:=CORE_INIT_ADR+1;
431                        sysRam.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
432                        if interf.ramsel='0' then
433                                Rank<=SysRam.Data_out(3 downto 0);
434                                NextCtx:=0;
435                        end if; 
436                end if;
437end procedure;
438
439--int MPI_Win_create(
440--  void *base,
441--  MPI_Aint size,
442--  int disp_unit,
443--  MPI_Info info,
444--  MPI_Comm comm,
445--  MPI_Win *win
446--);
447procedure pMPI_Win_create(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
448                                                                        base :std_logic_vector; size : Mpi_Aint;disp_unit:natural; 
449                                                                        info:natural; comm:Mpi_Comm; Win: inout MPI_Win ) is
450 -- parcours de la liste des fenêtres existantes à la recherche d'un emplacement libre
451 -- si fenêtre libre trouvée, et
452 -- mise à 1 du Bit WCreate du registre status
453 type wtype is array (1 to 4 ) of natural range 0 to 255;
454 variable AdrWin: std_logic_vector(ADRLEN-1 downto 0);
455 variable adresse : std_logic_vector(ADRLEN-1 downto 0);
456 variable clkin : std_logic:='1';
457 variable wcreate_adr : std_logic_vector(ADRLEN-1 downto 0):=std_logic_vector(to_unsigned(Core_wcreate_adr,ADRLEN));
458 variable w0 : std_logic_vector(Word-1 downto 0);
459 variable adrnat : natural;
460 variable sizewin : std_logic_vector(Word-1 downto 0);
461 variable count : natural range 0 to 255;
462 variable wdisp  :wtype:=(4,14,24,34); --stocke l'adresse de la prochaine Win libre
463begin
464-- création d'une fenêtre il s'agit d'affecter l'objet Win et de retourner
465-- le pointeur qui permet de le décrire
466
467
468If NextCtx=0 then 
469        NExtCtx:=NextCtx+1;
470        count:=0;
471        Interf.Intstate1<=count;
472elsif NextCtx>=1 and NextCtx <= 4 then
473        count:=Interf.IntState1;
474        AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(NextCtx),16));
475         readmem(count,interf,sysRam,AdrWin,w0);
476                if count=0 then
477                        if w0(0)/='1' then -- cette fenêtre est libre
478                                NextCtx:=6; --étape de la création de la fenêtre
479                                Win.addr:=base; --l'adresse de la fenêtre
480                                Win.id:=NextCtx; -- la référence provisoire de la fenêtre
481                                Win.size:=Size; -- la taille de la fenêtre
482                               
483                        else
484                                NextCtx:=NextCtx+1;
485                        end if;
486                end if;
487                Interf.intstate1<=count;--sauvegarde du statut de la sous-procédure
488               
489elsif NextCtx=5 then
490        -- Plus de fenêtre disponible erreur
491                NextCtx:=1; -- boucle sans fin :)
492                Win.id:=0;
493                Win.addr:=x"0000";
494elsif NextCtx=6 then
495                --Affectation de l'objet Windows car une place est disponible
496                count:=Interf.intstate1;
497                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
498                Writemem(count,interf,SysRam,AdrWin,x"01"); --signal status pour created
499                Interf.intstate1<=count;
500                if count=0 then
501                        NextCtx:=NextCtx+1;
502                end if;
503               
504elsif NextCtx=8 then
505                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
506                interf.winid<=interf.winid+1;
507                count:=Interf.intstate1;
508                Writemem(count,interf,SysRam,AdrWin+1,stdlv(interf.winid,8)); --win id de la fenêtre
509                Interf.intstate1<=count;
510                if count=0 then
511                        NextCtx:=NextCtx+1;
512                end if;
513elsif NextCtx=9 then
514
515                adrnat:=Core_base_adr+Wdisp(Win.id);
516               
517                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
518                count:=Interf.intstate1;
519               
520               
521                Writemem(count,interf,SysRam,AdrWin+2,base(7 downto 0)); --adresse basse
522                Interf.intstate1<=count;
523                if count=0 then
524                        NextCtx:=NextCtx+1;
525                end if;
526elsif NextCtx=10 then
527                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
528                count:=Interf.intstate1;
529                Writemem(count,interf,SysRam,AdrWin+3,base(15 downto 8)); --adresse haute
530                Interf.intstate1<=count;
531                if count=0 then
532                        NextCtx:=NextCtx+1;
533                end if;
534elsif NextCtx=11 then
535                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
536                sizewin:=std_logic_vector(to_unsigned(size,8));
537                count:=Interf.intstate1;
538                Writemem(count,interf,SysRam,AdrWin+4,sizewin); -- taille de la fenêtre
539                Interf.intstate1<=count;
540                if count=0 then
541                        NextCtx:=NextCtx+1;
542                end if;
543elsif NextCtx=12 then   
544        --cette étape consiste à envoyer le message WINCREATE Sur le réseau et à récupérer
545        -- les informations donnant le numéro de la fenêtre
546                W0:=MPI_WINCREATE & std_logic_vector(to_unsigned(0,4)); --code fonction
547                count:=Interf.intstate1;
548                Writemem(count,interf,SysRam,wcreate_adr,w0);
549                Interf.intstate1<=count;
550                if count=0 then
551                        NextCtx:=NextCtx+1;
552                end if;
553               
554        elsif NextCtx=13 then 
555                w0:=std_logic_vector(to_unsigned(Win.Id,8));                                                    -- id proposé pour la fenêtre en création
556                count:=Interf.intstate1;
557                Writemem(count,interf,SysRam,wcreate_adr+1,w0);
558                Interf.intstate1<=count;
559                if count=0 then
560                        NextCtx:=NextCtx+1;
561                end if;
562        elsif NextCtx=14 then
563                SysRam.we<='1';
564                SysRam.ena<='1';
565                SysRam.enb<='0';
566                count:=Interf.intstate1;
567                if interf.Ramsel='0' then
568                        WritePtr (wcreate_adr,count,SysRam); --écriture du pointeur d'instruction
569                        Interf.intstate1<=count;
570                        if count=0 then
571                                NextCtx:=NextCtx+1;
572                        end if;
573                end if;
574        elsif NextCtx=15 then
575                                                                        -- il faut mettre instruction_en à 1
576                                SysRam.we<='0';
577                                SysRam.ena<='0';
578                                SysRam.enb<='1';
579                                SysRam.we<='1';
580                                SysRam.ena<='1';
581                                SysRam.enb<='1';
582                                adresse:=stdlv(core_base_adr+1);
583                                                                SysRam.addr_rd<=adresse;
584                                                                sysRam.Addr_wr<=adresse;
585                                                                sysRam.Data_in<=x"01"; --instruction pulse enable via la mémoire;
586                Writemem(count,interf,SysRam,adresse,x"01");
587                Interf.intstate1<=count;
588                if count=0 then
589                        NextCtx:=NextCtx+1;
590                end if;
591                                Interf.Instr_En<='1';
592                                adresse:=stdlv(core_base_adr);
593                                sysRam.Addr_rd<=adresse;
594                                NextCtx:=NextCtx+1;
595        elsif NextCtx=16 then --acquittement de la copie des données dans le tampon de la lib
596                                if Interf.Instr_ack='1' then
597                                        Interf.Instr_En<='0';
598                                        NextCtx:=NextCtx+1;
599                                end if;
600                                SysRam.we<='0';
601                                SysRam.ena<='0';
602                                SysRam.enb<='1';
603        elsif NextCtx=17 then
604                        -- lecture du résultat de l'instruction
605                       
606       
607else
608       
609end if;
610end procedure;
611--int MPI_Win_start(
612--  MPI_Group group,
613--  int assert,
614--  MPI_Win win
615--);
616procedure pMPI_Win_start( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win) is
617--cette fonction active les bits WStart pour chaque processus avec lequel
618-- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
619--chacune de ces cibles
620 begin
621
622 -- retour de l'adresse de de la fenêtre dans la structure Win
623 -- initialisation des bits concernant
624 
625 
626 
627 end procedure;
628procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
629begin
630
631end procedure;
632procedure pMPI_Win_post( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win) is
633--cette fonction active les bits WStart pour chaque processus avec lequel
634-- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
635--chacune de ces cibles
636 begin
637 
638 end procedure;
639 
640 procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
641--permet de synchroniser la fin des opérations sur une fenêtre
642variable dcount : natural range 0 to 255:=0;
643variable cstatus : std_logic_vector(Word-1 downto 0);
644
645begin
646
647       
648       
649                if NextCtx =0 then 
650                        NextCtx:=NextCtx+1;
651                elsif NextCtx=1 then
652                        if interf.ramsel='0' then
653                                        SysRam.we<='0';
654                                        SysRam.ena<='0';
655                                        SysRam.enb<='1';
656                                        SysRam.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
657                                                        if SysRam.Data_out(5)='1' and  SysRam.Data_out(4)='1' and SysRam.Data_out(2)='0' then 
658                                                                        NextCtx:=NextCtx+1;
659                                                        end if;                                                 
660                        end if;
661       
662        elsif NextCtx=2 then
663                NextCtx:=0;
664        end if;
665
666
667end procedure;
668
669
670 Procedure pMPI_Finalize(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram) is
671  begin
672 
673 end procedure;
674 
675 
676procedure pMPI_INIT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram) is
677variable i,dcount : natural:=0; 
678variable adresse :natural;
679variable init_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_init_adr,ADRLEN));
680begin
681                                init_adr:=Std_logic_vector(to_unsigned(Core_init_adr,ADRLEN));
682                                if NextCtx =0 then
683                                       
684                                        SysRam.we<='1';
685                                        SysRam.ena<='1';
686                                        SysRam.enb<='0';
687                                        if interf.ramsel='0' then
688                                        NextCtx:=1;
689                                        adresse:=core_init_adr;
690                                        sysRam.Data_in<=MPI_INIT & x"0" ;
691                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
692                                       
693                                       
694                                        Interf.Instr_En<='0';
695                                        end if;
696                                elsif NextCtx=1 then
697                                        SysRam.we<='1';
698                                        SysRam.ena<='1';
699                                        SysRam.enb<='0';
700                                        if interf.ramsel='0' then
701                                        NextCtx:=2;
702                                        adresse:=core_init_adr;
703                                        sysRam.Data_in<=MPI_INIT & x"0" ;
704                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
705                                        Interf.Instr_En<='0';
706                                        end if;
707                               
708                                elsif NextCtx=2 then 
709                                        SysRam.we<='1';
710                                        SysRam.ena<='1';
711                                        SysRam.enb<='0';
712                               
713                                        sysRam.Data_in<=MPI_INIT & x"0" ;
714                                        sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
715                                        NextCtx:=3;
716                                elsif NextCtx=3 then
717                                        SysRam.we<='1';
718                                        SysRam.ena<='1';
719                                        SysRam.enb<='0';
720                                        dcount:=1;
721                                        if interf.ramsel='0' then
722                                                sysRam.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,ADRLEN));
723                                                WritePtr (init_adr,dcount,SysRam);
724                                                Interf.Instr_En<='0';
725                                                --if dcount =0 then
726                                                                NextCtx:=4;
727                                                --end if;
728                                        end if;
729                                elsif NextCtx>=4 and NextCtx<=7 then
730                                                        SysRam.we<='1';
731                                                        SysRam.ena<='1';
732                                                        SysRam.enb<='1';
733                                        if interf.ramsel='0' then
734                                                dcount:=NextCtx-3;
735                                                WritePtr (init_adr,dcount,SysRam);
736                                                NextCtx:=NextCtx+1;
737                                                if dcount =4 then 
738                                                                NextCtx:=8;
739                                                end if;
740                                        end if;
741                                elsif NextCtx=8 then --fin de la fonction
742                                                        SysRam.we<='0';
743                                                        SysRam.ena<='0';
744                                                        SysRam.enb<='1';
745                                                        dcount:=0;
746                                                        Interf.Instr_En<='1';
747                                                        sysRam.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,AdrLen));
748                                                        NextCtx:=9;
749                                elsif NextCtx=9 then --acquittement de la copie des données dans le tampon
750                                                        if Interf.Instr_ack='1' then
751                                                                Interf.Instr_En<='0';
752                                                                NextCtx:=10;
753                                                        end if;
754                                                        SysRam.we<='0';
755                                                        SysRam.ena<='0';
756                                                        SysRam.enb<='1';
757                                                       
758                                elsif NextCtx=10 then --lecture de la fin de l'initialisation
759                                                        SysRam.we<='0';
760                                                        SysRam.ena<='0';
761                                                        SysRam.enb<='1';
762                                                        if Interf.RamSel='0' then 
763                                                                SysRam.addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,Adrlen));
764                                                                if SysRam.Data_out(4)='1' then 
765                                                                        NextCtx:=11;
766                                                                end if;
767                                                        end if;                                                         
768                                elsif NextCtx =11 then
769                                                        Interf.Instr_En<='0';
770                                                        SysRam.we<='0';
771                                                        SysRam.ena<='0';
772                                                        SysRam.enb<='0';
773                                                        NextCtx:=0;
774                                end if;
775                                                       
776                               
777end procedure;
778
779
780procedure WriteMem(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
781                                                AdrVect:in std_logic_vector; Data:in std_logic_vector) is
782--cette procédure permet d'écrire un mot dans la mémoire du PE(tâche matérielle)
783--en ayant vérifié que le bus est bien disponible pour l'écriture
784 variable i,dcount : natural:=0;       
785variable adresse :natural;
786variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
787
788begin
789                                if NextCtx /=0 then --préserver la valeur de count entre les appels
790                                        dcount:=NextCtx;
791                                else
792                                       
793                                       
794                                end if;
795                               
796                                                       
797                                if dcount=0 then
798                                        if Interf.RamSel='0' then 
799                                                dcount :=dcount+1;
800                                        end if;
801                                                sysRam.Data_in<=AdrToSet(Word-1 downto 0);                                     
802                                                sysRam.Addr_wr<=adrToSet;
803                                elsif dcount=1 then
804                                                if Interf.RamSel='0' then 
805                                                       
806                                                        dcount :=dcount+1;
807                                                end if;
808                                                sysRam.Data_in<=data;
809                                                sysRam.Addr_wr<=adrToSet;
810                                elsif dcount=2 then
811                                                sysRam.Data_in<=data;
812                                                dcount :=dcount+1;
813                                                sysRam.Addr_wr<=AdrToSet;
814                                elsif dcount=3 then
815                               
816                                                dcount :=dcount+1;
817                                                sysRam.Addr_wr<=adrToSet;
818                                                sysRam.Data_in<=data;
819                                elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
820                                                dcount:=0;
821                                                sysRam.Addr_wr<=AdrToSet;               
822                                end if;
823                                       
824                                        NextCtx:=dcount;
825end procedure;
826
827-- écriture dans la mémoire
828procedure ReadMem(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
829                                                AdrVect:in std_logic_vector; data: out std_logic_vector) is
830--cette procédure permet d'écrire un mot dans la mémoire du PE(tâche matérielle)
831--en ayant vérifié que le bus est bien disponible pour l'écriture
832 variable i,dcount : natural:=0;       
833variable adresse :natural;
834variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
835
836begin
837                                if NextCtx /=0 then --préserver la valeur de count entre les appels
838                                        dcount:=NextCtx;
839                                else
840                                       
841                                       
842                                end if;
843                                                       
844                                if dcount=0 then
845                                        if Interf.RamSel='0' then 
846                                                dcount :=dcount+1;
847                                        end if;
848                                                                                       
849                                                sysRam.Addr_rd<=adrToSet;
850                                elsif dcount=1 then
851                                                data:=sysRam.Data_out;
852                                                dcount :=dcount+1;
853                                                sysRam.Addr_rd<=adrToSet;
854                                elsif dcount=2 then
855                                                data:=sysRam.Data_out;
856                                                dcount :=dcount+1;
857                                                sysRam.Addr_rd<=adrToSet;
858                                elsif dcount=3 then
859                                                if Interf.RamSel='0' then 
860                                                dcount :=dcount+1;
861                                                sysRam.Addr_rd<=adrToSet;
862                                                data:=sysRam.Data_out;
863                                                end if;
864                                elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
865                                                dcount:=0;
866                                                                                       
867                                end if;
868                                       
869                                        NextCtx:=dcount;
870end procedure;
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888procedure WritePtr(AdrVect:in std_logic_vector; count: inout natural;signal SysRam :out typ_dpram) is
889--cette procédure permet d'écrire dans la mémoire du PE(tâche matérielle)
890--les données de l'appel de la procédure
891variable i,dcount : natural:=0; 
892variable adresse :natural;
893variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
894begin
895                                if count /=0 then --préserver la valeur de count entre les appels
896                                        dcount:=count;
897                                else
898                                       
899                                       
900                                end if;
901                                adresse:=Core_base_adr+2;
902                                                       
903                                if dcount=0 then
904                                                sysRam.Data_in<=AdrToSet(Word-1 downto 0);
905                                                dcount :=dcount+1;
906                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
907                                elsif dcount=1 then
908                                sysRam.Data_in<=AdrToSet(Word-1 downto 0);
909                                                dcount :=dcount+1;
910                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
911                                elsif dcount=2 then
912                                sysRam.Data_in<=AdrToSet(ADRLEN-1 downto Word);
913                                                dcount :=dcount+1;
914                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));
915                                elsif dcount=3 then
916                                                dcount :=dcount+1;
917                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));
918                                                sysRam.Data_in<=AdrToSet(ADRLEN-1 downto Word);
919                                elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
920                                                dcount:=0;
921                                                sysRam.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));               
922                                end if;
923                                       
924                                        count:=dcount;
925end procedure;
926end MPI_Rma;
Note: See TracBrowser for help on using the repository browser.