source: PROJECT_CORE_MPI/CORE_MPI/TRUNK/MPI_RMA.vhd

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