source: PROJECT_CORE_MPI/CORE_MPI/BRANCHES/v0.02/MPI_RMA.vhd @ 37

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