source: PROJECT_CORE_MPI/MPI_HCL/TRUNK/MPI_RMA.vhd @ 96

Last change on this file since 96 was 96, checked in by rolagamo, 10 years ago
File size: 61.5 KB
Line 
1--      Package File Template
2--
3--      Purpose: This package defines supplemental types, subtypes,
4--               constants, and functions
5
6
7library IEEE;
8use IEEE.STD_LOGIC_1164.all;
9use ieee.numeric_std.all;
10use IEEE.STD_LOGIC_ARITH.ALL;
11use IEEE.STD_LOGIC_UNSIGNED.ALL;
12Library NocLib;
13use NocLib.CoreTypes.all;
14use work.PACKET_TYPE.all;
15
16package Mpi_Rma is
17procedure WritePtr(AdrVect:in std_logic_vector; count: inout natural;signal SysRam :out typ_dpram);
18procedure pMPI_INIT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram);
19procedure pMPI_PUT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
20 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
21  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
22  Target_Datatype :natural; Win : natural);
23
24procedure pMPI_GET(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
25 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
26  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
27  Target_Datatype :natural; Win : natural);
28procedure pMPI_Comm_Rank(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; COMM :in natural; signal Rank : out std_logic_vector );
29
30procedure pMPI_Win_create(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
31                                                                        base :std_logic_vector; size : Mpi_Aint;disp_unit:natural; 
32                                                                        info:natural; comm:Mpi_Comm; Win: inout MPI_Win );
33procedure pMPI_Win_start( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
34procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
35procedure pMPI_Win_post( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
36procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
37procedure pMPI_Comm_Spawn(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; 
38command : natural;  argv :natural; maxprocs : natural;  info : natural; root : natural;   comm : natural; 
39signal intercomm :out natural; signal  array_of_errcodes : out natural);
40-- declare functions and procedure       
41 procedure ReadMem( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
42                                                AdrVect:in std_logic_vector; data: out std_logic_vector);
43procedure WriteMem(NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
44                                                AdrVect:in std_logic_vector; Data:in std_logic_vector);                                         
45
46procedure SetBit( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
47                                variable        AdrVect:in std_logic_vector(ADrLen-1 downto 0); variable BitMask: in std_logic_vector(Word-1 downto 0);bitval:in std_logic);
48
49end MPI_Rma;
50
51
52package body MPI_Rma is
53----int MPI_Put(
54--  void *origin_addr,
55--  int origin_count,
56--  MPI_Datatype origin_datatype,
57--  int target_rank,
58--  MPI_Aint target_disp,
59--  int target_count,
60--  MPI_Datatype target_datatype,
61--  MPI_Win win
62--);
63-- Example 1
64procedure pMPI_PUT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
65 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
66  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
67  Target_Datatype :natural; Win : natural) is
68variable i,dcount,wr_state : natural:=0;
69variable adresse :natural;
70variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
71variable addr2 :std_logic_vector(Target_Disp'length-1 downto 0):=Target_Disp;
72variable put_adr : std_logic_vector (ADRLEN-1 downto 0);
73variable config_reg: std_logic_vector (Word-1 downto 0);
74constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
75        begin   
76                                put_adr:=conv_Std_logic_vector(Core_put_adr,ADRLEN);
77                               
78                                addr1:=Orig_Addr;
79                                addr2:=Target_Disp;
80                                if NextCtx /=0 then --préserver la valeur de count entre les appels
81                                dcount:=NextCtx;
82                                end if;
83--                                     
84                                       
85                                if rising_edge(clkin) then             
86                                  if dcount= 0 then
87                                      dcount:=dcount+1;
88                                      Interf.S.Intstate1<=0;
89                                        elsif dcount>=1 and dcount <=3 then 
90                                                                        if interf.I.ramsel='0' then
91                                                                                        Interf.O.membusy<='0';
92                                                                                        --SysRam.O.we<='1';
93                                                                                        --SysRam.O.ena<='1';
94                                                                                        SysRam.O.enb<='1';
95                                                                                        wr_state:=interf.S.Intstate1;
96                                                                                        WritePtr (put_adr,wr_state,SysRam);
97                                                                                        interf.S.Intstate1<=wr_state;
98                                                                                        if wr_state =0 then 
99                                                                                                -- fin de l'écriture du pointeur en mémoire
100                                                                                        dcount:=4;
101                                                                                        end if;                                                         
102                                                                        end if;
103                                                       
104                                                        elsif dcount=4 then
105                                                        if interf.I.ramsel='0' then
106                                                                SysRam.O.we<='1';
107                                                                SysRam.O.ena<='1';
108                                                                SysRam.O.enb<='0';
109                                                                Interf.O.membusy<='1';
110                                                                if target_rank <=15 then --limitation de cete version à 16 rang
111                                                                Interf.S.Gstart(Target_rank)<='1';
112                                                                end if;
113                                                                adresse:=core_put_adr;
114                                                                SysRam.O.Data_in<=MPI_PUT & conv_std_logic_vector(Target_Rank,4); --code fonction
115                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
116                                                                dcount:=dcount+1;
117                                                        end if;
118                                                        elsif dcount=5 then 
119                                                                if interf.I.ramsel='0' then
120                                                                adresse:=core_put_adr+1;
121                                                                SysRam.O.Data_in<=std_logic_vector(to_unsigned(Orig_Count,8)) ;--la longueur
122                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
123                                                                dcount:=dcount+1;
124                                                                Interf.O.Instruction<=x"06"; -- nombre de mots de l'instruction
125                                                                end if;
126                                                        elsif dcount=6 then
127                                                                if interf.I.ramsel='0' then
128                                                                adresse:=core_put_adr+2;
129                                                                SysRam.O.Data_in<= Addr1(ADRLEN-1 downto Word) ; --source Haut
130                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
131                                                                dcount:=dcount+1;
132                                                                end if;
133                                                        elsif dcount=7 then
134                                                                if interf.I.ramsel='0' then
135                                                                adresse:=core_put_adr+3;
136                                                                SysRam.O.Data_in<=Addr1(Word-1 downto 0);  --source Bas
137                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
138                                                                dcount:=dcount+1;
139                                                                end if;
140                                                        elsif dcount=8 then
141                                                                if interf.I.ramsel='0' then
142                                                                adresse:=core_put_adr+4;
143                                                                SysRam.O.Data_in<= Addr2(ADRLEN-1 downto Word) ; -- destination haut
144                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
145                                                                dcount:=dcount+1;
146                                                                end if;
147                                                        elsif dcount=9 then
148                                                                if interf.I.ramsel='0' then
149                                                                adresse:=core_put_adr+5;
150                                                                SysRam.O.Data_in<=Addr2(Word-1 downto 0); -- destination bas
151                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
152                                                                dcount:=dcount+1;
153                                                                end if;
154                                                        elsif dcount=10 then
155                                                               
156                                                                SysRam.O.we<='1';
157                                                                SysRam.O.ena<='1';
158                                                                SysRam.O.enb<='1';
159                                                                if interf.I.ramsel='0' then
160                                                                adresse:=core_base_adr+1;
161                                                                SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
162                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
163                                                                SysRam.O.Data_in<=x"01"; --instruction pulse enable via la mémoire;
164                                                                Interf.O.Instr_En<='1'; --active la prise en compte de l'instruction
165                                                                Interf.O.membusy<='0';
166                                                                dcount:=dcount+1;
167                                                                end if;
168                                                        elsif dcount=11 then
169                                                                if Interf.I.Instr_ack='1' then -- le Core a reçu l'instruction ?
170                                                                        Interf.O.Instr_En<='0';   --désactiver la prise en compte de l'instruction
171                                                                        dcount:=dcount+1;
172                                                                        config_reg:=SysRam.I.Data_out and x"f6";
173                                                                        SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
174                                                                else
175                                                                  Interf.O.Instr_En<='1'; 
176                                                                end if;
177                                                                        adresse:=core_base_adr+1;
178                                                                        SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
179                                                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
180                                                                        --SysRam.O.Ram_busy<='0'; --??
181                                                                        SysRam.O.we<='0';
182                                                                        SysRam.O.ena<='0';  -- préparer la lecture du résultat du Put
183                                                                        SysRam.O.enb<='1';                                             
184                                                        elsif dcount=12 then
185                                                                        adresse:=core_base_adr+1;
186                                                                        SysRam.O.we<='1';
187                                                                        SysRam.O.ena<='1';  -- préparer l'écriture du résultat du Put
188                                                                        SysRam.O.enb<='1';
189                                                                        if interf.I.ramsel='0' then
190                                                                        config_reg:=SysRam.I.Data_out and x"f6";
191                                                                        SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
192                                                                        dcount:=dcount+1;
193                                                                        Interf.O.membusy<='1';
194                                                                        end if;
195                                                                        SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
196                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
197                                                        elsif dcount=13 then
198                                                                        SysRam.O.we<='1';
199                                                                        SysRam.O.ena<='1';  -- préparer l'écriture du résultat du Put
200                                                                        SysRam.O.enb<='0';
201                                                                        config_reg:=SysRam.I.Data_out and x"f6";
202                                                                        SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
203                                                                        dcount:=dcount+1;
204                                                                        adresse:=core_base_adr+1;
205                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
206                                                        elsif dcount=14 then   
207                                                                        SysRam.O.we<='0';
208                                                                        SysRam.O.ena<='0';
209                                                                        SysRam.O.enb<='1';
210                                                                        Interf.O.membusy<='0';
211                                                                        if interf.I.ramsel='0' then 
212                                                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+6,Adrlen));
213                                                                                if SysRam.I.Data_out(0)='1' then --fin du MPI PUT ici pour l'envoie !
214                                                                                        dcount:=dcount+1;
215                                                                                        SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
216                                                                                  Interf.S.Intstate2<=255; --timer pour la réception
217                                                                                  interf.s.tmem(0)<=x"02";
218                                                                                  report "MPV pMPI_PUT():Ex1 de HCL a répondu concernant l'envoi";
219                                                                                end if;
220                                                                        end if;
221                                                        elsif dcount=15 or dcount=16 or dcount=17 then
222                                                          SysRam.O.we<='0';
223                                                                        SysRam.O.ena<='0';
224                                                                        SysRam.O.enb<='1';
225                                                          SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
226                                                           -- ce cycle permet d'attendre la donnée en sortie après le changement d'adresse
227                                                 
228                                                   if interf.I.ramsel='0' then 
229                                                          dcount:=dcount+1; -- ce cycle permet d'attendre la donnée en sortie après le changement d'adresse
230                                                         
231                                                    elsif Interf.S.Intstate2>0  then 
232                                                      dcount:=15;
233                                                                                  Interf.S.Intstate2<=Interf.S.Intstate2-1;
234                                                                elsif interf.s.tmem(0)>0 then
235                                                                                    interf.s.tmem(0)<=interf.s.tmem(0)-1;
236                                                                                    Interf.S.Intstate2<=255;
237                                                                                    dcount:=15;
238                                                                else
239                                                                                   dcount:=1;--recommencer l'envoi
240                                                                end if;
241                                                        elsif dcount=18 then   
242                                                                        SysRam.O.we<='0';
243                                                                        SysRam.O.ena<='0';
244                                                                        SysRam.O.enb<='1';
245                                                                        Interf.O.membusy<='0';
246                                                                        if interf.I.ramsel='0' then 
247                                                                                SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
248                                                                                if SysRam.I.Data_out(5)='1' then --Message  du MPI PUT bien reçu !
249                                                                                        dcount:=dcount+1;
250                                                                                        report "MPV pMPI_PUT():Ex2 de HCL a reçu un acquittement concernant l'envoi";
251                                                                                        SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
252                                                                                elsif Interf.S.Intstate2>0  then 
253                                                                                  Interf.S.Intstate2<=Interf.S.Intstate2-1;
254                                                                                 elsif interf.s.tmem(0)>0 then
255                                                                                    interf.s.tmem(0)<=interf.s.tmem(0)-1;
256                                                                                    Interf.S.Intstate2<=255;
257                                                                                  else
258                                                                                   dcount:=1;--recommencer l'envoi
259                                                                                   report "MPV pMPI_PUT():Timeout EX2 n'a pas reçu d'acquitement concernant l'envoi. reémission en cours...";
260                                                                                end if;
261                                                                        else
262                                                                          dcount:=15;
263                                                                        end if;
264                                                        elsif dcount=19 then   
265                                                                        dcount:=0; --fin normale de la fonction
266                                                                        Interf.O.membusy<='0';
267                                                                        report "MPV pMPI_PUT():fin normale de la fonction";
268                                                        end if;
269                                                       
270                                                       
271                                                  NExtCtx:=dcount;
272                                end if;
273        end procedure;
274
275procedure pMPI_GET(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
276 Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
277  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
278  Target_Datatype :natural; Win : natural) is
279variable i,wcount,dcount : natural range 0 to 255:=0;
280variable adresse :natural;
281variable wdata: std_logic_vector(Word-1 downto 0):=(others=>'0');
282variable bitval : std_logic:='0';
283variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
284variable addr2 :std_logic_vector(Target_Disp'length-1 downto 0):=Target_Disp;
285variable get_adr : std_logic_vector (ADRLEN-1 downto 0);
286variable config_reg,win_reg: std_logic_vector (Word-1 downto 0);
287constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
288        begin   
289                                get_adr:=Std_logic_vector(to_unsigned(Core_get_adr,ADRLEN));
290                               
291                                addr1:=Orig_Addr;
292                                addr2:=Target_Disp;
293                                if NextCtx /=0 then --préserver la valeur de count entre les appels
294                                dcount:=NextCtx;
295                                end if;
296--                                     
297                                       
298                                if rising_edge(clkin) then             
299                                                       
300                                                if dcount =0 then       
301                                                        dcount:=dcount+1;
302                                                        Interf.S.IntState1<=0;
303                                                elsif dcount>=1 and dcount <=3 then 
304                                                                        if interf.I.ramsel='0' then
305                                                                                        SysRam.O.we<='1';
306                                                                                        SysRam.O.ena<='1';
307                                                                                        SysRam.O.enb<='0';
308                                                                                        wcount:=Interf.S.IntState1;
309                                                                                        WritePtr (get_adr,wcount,SysRam);
310                                                                                        Interf.S.IntState1<=wcount;
311                                                                                        Interf.O.membusy<='1';
312                                                                                        if wcount =0 then 
313                                                                                                dcount:=4;
314                                                                                                Interf.S.Intstate1<=1;
315                                                                                        end if; 
316                                                                                else 
317                                                                                  Interf.S.IntState1<=0;
318                                                                                                                                       
319                                                                        end if;
320                                                       
321                                                        elsif dcount=4 then
322                                                        if interf.I.ramsel='0' then 
323                                                                SysRam.O.we<='1';
324                                                                SysRam.O.ena<='1';
325                                                                SysRam.O.enb<='0';
326                                                                if target_rank <=15 then --limitation de cete version à 16 rang
327                                                                Interf.S.Gstart(Target_rank)<='1';
328                                                                end if;
329                                                                adresse:=core_get_adr;
330                                                                SysRam.O.Data_in<=MPI_GET & conv_Std_logic_vector(Target_Rank,4); --code fonction
331                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
332                                                                Interf.O.membusy<='1';
333                                                                dcount:=dcount+1;
334                                                        end if;
335                                                        elsif dcount=5 then 
336                                                                if interf.I.ramsel='0' then     
337                                                                        SysRam.O.we<='1';
338                                                                        SysRam.O.ena<='1';
339                                                                        adresse:=core_get_adr+1;
340                                                                        SysRam.O.Data_in<=std_logic_vector(to_unsigned(Orig_Count,8)) ;--la longueur
341                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
342                                                                  interf.O.Instruction<=x"06"; --le nbre de mots de l'intstruction
343                                                                        dcount:=dcount+1;
344                                                                end if; 
345                                                        elsif dcount=6 then
346                                                                if interf.I.ramsel='0' then 
347                                                                        SysRam.O.we<='1';
348                                                                        SysRam.O.ena<='1';
349                                                                        adresse:=core_get_adr+2;
350                                                                        SysRam.O.Data_in<= Addr1(ADRLEN-1 downto Word) ; --source Haut
351                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
352                                                                       
353                                                                        dcount:=dcount+1;
354
355                                                                end if;
356                                                        elsif dcount=7 then
357                                                                if interf.I.ramsel='0' then
358                                                                        SysRam.O.we<='1';
359                                                                        SysRam.O.ena<='1';
360                                                                        adresse:=core_get_adr+3;
361                                                                        SysRam.O.Data_in<=Addr1(Word-1 downto 0);  --source Bas
362                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
363                                                                       
364                                                                        dcount:=dcount+1;
365                                                                end if;
366                                                        elsif dcount=8 then
367                                                                if interf.I.ramsel='0' then 
368                                                                        SysRam.O.we<='1';
369                                                                        SysRam.O.ena<='1';                                     
370                                                                        adresse:=core_get_adr+4;
371                                                                        SysRam.O.Data_in<= Addr2(ADRLEN-1 downto Word) ; -- destination haut
372                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
373                                                                        Interf.O.membusy<='1';
374                                                                        dcount:=dcount+1;
375                                                                end if;
376                                                        elsif dcount=9 then
377                                                                if interf.I.ramsel='0' then
378                                                                        SysRam.O.we<='1';
379                                                                        SysRam.O.ena<='1';
380                                                                        adresse:=core_get_adr+5;
381                                                                        SysRam.O.Data_in<=Addr2(Word-1 downto 0); -- destination bas
382                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
383                                                                        Interf.O.membusy<='1';
384                                                                        dcount:=dcount+1;
385                                                                end if;
386                                                                elsif dcount=10 then
387                                                                if interf.I.ramsel='0' then
388                                                                        SysRam.O.we<='1';
389                                                                        SysRam.O.ena<='1';
390                                                                        adresse:=core_get_adr+7;
391                                                                        SysRam.O.Data_in<=x"00"; -- résultat du GET
392                                                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
393                                                                        Interf.O.membusy<='1';
394                                                                        Interf.S.IntState2<=0;
395                                                                        dcount:=dcount+1;
396                                                                end if;
397                                                        elsif dcount=11 then
398                                                                 
399                                                                        SysRam.O.we<='1';
400                                                                        SysRam.O.ena<='1';
401                                                                        SysRam.O.enb<='1';
402                                                                        addr1:=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
403                                                                        wcount:=Interf.S.IntState2;
404                                                                        wdata:=x"01";bitval:='1';
405                                                                        setBit(wcount,Interf,SysRam,addr1(ADrLen-1 downto 0),wdata,bitval);
406                                                                        Interf.S.IntState2<=wcount;
407                                                                        if wcount=0 then
408                                                                          dcount:=dcount+1;
409                                                                          Interf.O.Instr_En<='1'; --active la prise en compte de l'instruction
410                                                                         end if;
411
412                                                        elsif dcount=12 then
413                                                                if Interf.I.Instr_ack='1' then -- le Core a reçu l'instruction ?
414                                                                        Interf.O.Instr_En<='0';   --désactiver la prise en compte de l'instruction
415                                                                        dcount:=dcount+1;
416                                                                        config_reg:=SysRam.I.Data_out and x"f6";
417                                                                        --SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
418                                                                end if;
419                                                                        adresse:=core_base_adr+1;
420                                                                        SysRam.O.addr_rd<=std_logic_vector(to_unsigned(adresse,ADRLEN));
421                                                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
422                                                                        --SysRam.O.Ram_busy<='0'; --??
423                                                                        SysRam.O.we<='0';
424                                                                        SysRam.O.ena<='0';  -- préparer la lecture du résultat du get
425                                                                        SysRam.O.enb<='1';     
426                                                                        Interf.O.membusy<='0';
427                                                        elsif dcount=13 then
428                                                               
429                                                                        adresse:=core_base_adr+1;
430                                                                        SysRam.O.we<='1';
431                                                                        SysRam.O.ena<='1';  -- préparer l'écriture du résultat du get
432                                                                        SysRam.O.enb<='1';
433                                                                        SysRam.O.addr_rd<=std_logic_vector(to_unsigned(adresse,ADRLEN));
434                                                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
435
436                                                                if interf.I.ramsel='0' then     
437                                                                        config_reg:=SysRam.I.Data_out and x"f6";
438                                                                        SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
439                                                                        dcount:=dcount+1;
440                                                                        Interf.O.membusy<='1';
441                                                                end if;
442                                                                                Interf.s.IntState2<=255;
443                                                                                Interf.s.tmem(0)<=x"08"; --tempo pour l'attente du résultat de Get                                                     
444                                                        elsif dcount=14 then
445                                                                         
446                                                                                SysRam.O.we<='1';
447                                                                                SysRam.O.ena<='1';  -- préparer l'écriture du résultat du GET
448                                                                                SysRam.O.enb<='0';
449                                                                                adresse:=core_base_adr+1;
450                                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
451                                                                        if interf.I.ramsel='0' then
452                                                                                config_reg:=SysRam.I.Data_out and x"f6";
453                                                                                SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
454                                                                                dcount:=18;--dcount+1;
455                                                                                Interf.O.membusy<='1';
456                                               
457                                                                        end if;
458                                                        elsif dcount=15 then
459                                                                         
460                                                                                SysRam.O.we<='0';
461                                                                                SysRam.O.ena<='0';  -- préparer l'écriture du WBusy
462                                                                                SysRam.O.enb<='1';
463                                                                                adresse:=core_base_adr+5;
464                                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
465                                                                                SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
466
467                                                                        if interf.I.ramsel='0' then
468                                                                                config_reg:=SysRam.I.Data_out or x"40"; --mettre à 1 Wbusy
469                                                                                SysRam.O.Data_in<=config_reg ; --mettre à 1 Wbusy
470                                                                                dcount:=dcount+1;
471                                                                                Interf.O.membusy<='1';
472                                                                        end if;
473                                                        elsif dcount=16 then
474                                                                         
475                                                                                SysRam.O.we<='0';
476                                                                                SysRam.O.ena<='0';  -- préparer l'écriture du WBusy
477                                                                                SysRam.O.enb<='1';
478                                                                                adresse:=core_base_adr+5;
479                                                                                SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
480                                                                        if interf.I.ramsel='0' then
481                                                                                config_reg:=SysRam.I.Data_out or x"40"; --mettre à 1 Wbusy
482                                                                                SysRam.O.Data_in<=config_reg ; --mettre à 1 Wbusy
483                                                                                dcount:=dcount+1;
484                                                                                Interf.O.membusy<='1';
485                                                               
486                                                                        end if;
487                                                        elsif dcount=17 then
488                                                                         
489                                                                                SysRam.O.we<='1';
490                                                                                SysRam.O.ena<='1';  -- préparer l'écriture du résultat du GET
491                                                                                SysRam.O.enb<='1';
492                                                                                adresse:=core_base_adr+5;
493                                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
494                                                                        if interf.I.ramsel='0' then
495                                                                                config_reg:=SysRam.I.Data_out or x"40";
496                                                                                SysRam.O.Data_in<=config_reg ; --;
497                                                                                dcount:=dcount+1;
498                                                                                Interf.O.membusy<='1';
499                                                                        end if;
500                                                        elsif dcount>=18 and dcount <=21 then   
501                                                                        SysRam.O.we<='0';
502                                                                        SysRam.O.ena<='0';
503                                                                        SysRam.O.enb<='1';
504                                                                        Interf.O.membusy<='0';
505                                                                        if interf.I.ramsel='0' then 
506                                                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_get_adr+6,Adrlen));
507                                                                                if SysRam.I.Data_out(0)='1' then --fin du MPI get ici pour l'envoie !
508                                                                                        dcount:=dcount+1;
509                                                                                end if;
510                                                                        end if;
511                 elsif dcount>=22 and dcount <=24 then 
512                                                                        SysRam.O.we<='0';
513                                                                        SysRam.O.ena<='0';
514                                                                        SysRam.O.enb<='1';
515                                                                        Interf.O.membusy<='0';
516                                                                        SysRam.O.addr_rd<=conv_Std_logic_vector(Core_Get_adr+7,Adrlen);
517                                                                        if interf.I.ramsel='0' then 
518                                                                                SysRam.O.addr_rd<=conv_Std_logic_vector(Core_Get_adr+7,Adrlen);
519                                                                                if SysRam.I.Data_out(5)='1' then --Message  du MPI Get bien reçu !
520                                                                                        dcount:=dcount+1; --ce test est fait avant l'arrivée effective des données ce qui pose problème !
521                                                                                        SysRam.O.addr_rd<=conv_Std_logic_vector(Core_Get_adr+7,Adrlen);
522                                                                                elsif Interf.S.Intstate2>0 then 
523                                                                                  Interf.S.Intstate2<=Interf.S.Intstate2-1;
524                                                                                 elsif interf.s.tmem(0)>0 then
525                          interf.s.tmem(0)<=interf.s.tmem(0)-1;
526                          Interf.S.Intstate2<=255;
527                                                                                  else
528                                                                                   dcount:=1;--recommencer l'envoi
529                                                                                end if;
530                                                                        end if;
531                                                       
532                                                        elsif dcount=25 then   
533                                                                        dcount:=0; --fin normale de la fonction
534                                                                        Interf.O.membusy<='0';
535                                                                        SysRam.O.we<='0';
536                                                                        SysRam.O.ena<='0';
537                                                                        SysRam.O.enb<='0';
538                                                        end if;
539
540                                                  NExtCtx:=dcount;
541                        end if; 
542        end procedure; 
543Procedure 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 
544Begin
545--cette procédure permet de récupérer le groupe qui est associé à un communicateur
546--dans notre cas c'est la récupération du groupe associé à COMM_WORLD
547end procedure;
548--int MPI_Group_incl(MPI_Group group, int n, int *ranks,
549--    MPI_Group *newgroup)
550Procedure pMPI_group_incl(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam : inout typ_dpram;
551                                                                        GRP: Mpi_group; n:natural;ranks :natural; newgroup: out Mpi_group) is
552Begin
553-- cette procedure a pour algo de parcourir les rangs qui sont dans la mémoire pointée par ranks
554-- et d'activer l'un des  bits de position de newgroup.
555--
556--
557end procedure;
558                                                               
559procedure 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
560variable adresse_rd : natural range 0 to 2**ADRLEN-1;   
561
562begin
563
564                if NextCtx =0 then
565                        SysRam.O.we<='0';
566                        SysRam.O.ena<='0';
567                        SysRam.O.enb<='1';
568                        adresse_rd:=CORE_INIT_ADR+1;
569                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
570                       
571                                NextCtx:=1;
572               
573                elsif NextCtx=1 then
574                        SysRam.O.we<='0';
575                        SysRam.O.ena<='0';
576                        SysRam.O.enb<='1';
577                        adresse_rd:=CORE_INIT_ADR+1;
578                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
579                        if interf.I.ramsel='0' then
580                                Rank<=SysRam.I.Data_out(3 downto 0);
581                                NextCtx:=2;
582                                Interf.O.membusy<='1';
583                        end if; 
584                elsif NextCtx=2 then
585                        SysRam.O.we<='0';
586                        SysRam.O.ena<='0';
587                        SysRam.O.enb<='1';
588                        adresse_rd:=CORE_INIT_ADR+1;
589                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
590                        if interf.I.ramsel='0' then
591                                Rank<=SysRam.I.Data_out(3 downto 0);
592                                Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
593                                NextCtx:=3;
594                                Interf.O.membusy<='1';
595                        end if; 
596                elsif NextCtx=3 then
597                        SysRam.O.we<='0';
598                        SysRam.O.ena<='0';
599                        SysRam.O.enb<='1';
600                        adresse_rd:=CORE_INIT_ADR+1;
601                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
602                        if interf.I.ramsel='0' then
603                                Rank<=SysRam.I.Data_out(3 downto 0);
604                                Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
605                                NextCtx:=4;
606                                Interf.O.membusy<='1';
607                        end if; 
608                elsif NextCtx=4 then
609                        SysRam.O.we<='0';
610                        SysRam.O.ena<='0';
611                        SysRam.O.enb<='1';
612                        adresse_rd:=CORE_INIT_ADR+1;
613                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
614                        if interf.I.ramsel='0' then
615                                Rank<=SysRam.I.Data_out(3 downto 0);
616                                Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
617                                NextCtx:=0;
618                                Interf.O.membusy<='0';
619                        end if; 
620                end if;
621end procedure;
622
623--int MPI_Win_create(
624--  void *base,
625--  MPI_Aint size,
626--  int disp_unit,
627--  MPI_Info info,
628--  MPI_Comm comm,
629--  MPI_Win *win
630--);
631procedure pMPI_Win_create(NextCtx : inout natural ;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
632                                                                        base :std_logic_vector; size : Mpi_Aint;disp_unit:natural; 
633                                                                        info:natural; comm:Mpi_Comm; Win: inout MPI_Win ) is
634 -- parcours de la liste des fenêtres existantes à la recherche d'un emplacement libre
635 -- si fenêtre libre trouvée, et
636 -- mise à 1 du Bit WCreate du registre status
637 type wtype is array (1 to 4 ) of natural range 0 to 255;
638 variable AdrWin: std_logic_vector(ADRLEN-1 downto 0);
639 variable adresse : std_logic_vector(ADRLEN-1 downto 0);
640 variable clkin : std_logic:='1';
641 variable wcreate_adr : std_logic_vector(ADRLEN-1 downto 0):=std_logic_vector(to_unsigned(Core_wcreate_adr,ADRLEN));
642 variable w0 : std_logic_vector(Word-1 downto 0);
643 variable adrnat : natural;
644 variable sizewin : std_logic_vector(Word-1 downto 0);
645 variable count : natural range 0 to 255;
646 variable wdisp  :wtype:=(4,14,24,34); --stocke l'adresse de la prochaine Win libre
647begin
648-- création d'une fenêtre il s'agit d'affecter l'objet Win et de retourner
649-- le pointeur qui permet de le décrire
650
651
652If NextCtx=0 then 
653        NExtCtx:=NextCtx+1;
654        count:=0;
655        Interf.O.membusy<='0';
656        Interf.S.IntState1<=count;
657elsif NextCtx>=1 and NextCtx <= 4 then
658        count:=Interf.S.IntState1;
659        AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(NextCtx),16));
660         readmem(count,interf,sysRam,AdrWin,w0);
661                if count=0 then
662                        if w0(0)/='1' then -- cette fenêtre est libre
663                                NextCtx:=6; --étape de la création de la fenêtre
664                                Win.addr:=base; --l'adresse de la fenêtre
665                                Win.id:=NextCtx; -- la référence provisoire de la fenêtre
666                                Win.size:=Size; -- la taille de la fenêtre
667                               
668                        else
669                                NextCtx:=NextCtx+1;
670                        end if;
671                end if;
672                Interf.S.IntState1<=count;--sauvegarde du statut de la sous-procédure
673               
674elsif NextCtx=5 then
675        -- Plus de fenêtre disponible erreur
676                NextCtx:=1; -- boucle sans fin :)
677                Win.id:=0;
678                Win.addr:=x"0000";
679elsif NextCtx=6 then
680                --Affectation de l'objet Windows car une place est disponible
681                count:=Interf.S.IntState1;
682                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
683                Writemem(count,interf,SysRam,AdrWin,x"01"); --signal status pour created
684                Interf.S.IntState1<=count;
685                if count=0 then
686                        NextCtx:=NextCtx+1;
687                end if;
688               
689elsif NextCtx=8 then
690                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
691                interf.S.winid<=interf.S.winid+1;
692                count:=Interf.S.IntState1;
693                Writemem(count,interf,SysRam,AdrWin+1,stdlv(interf.S.winid,8)); --win id de la fenêtre
694                Interf.S.IntState1<=count;
695                if count=0 then
696                        NextCtx:=NextCtx+1;
697                end if;
698elsif NextCtx=9 then
699
700                adrnat:=Core_base_adr+Wdisp(Win.id);
701               
702                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
703                count:=Interf.S.IntState1;
704               
705               
706                Writemem(count,interf,SysRam,AdrWin+2,base(7 downto 0)); --adresse basse
707                Interf.S.IntState1<=count;
708                if count=0 then
709                        NextCtx:=NextCtx+1;
710                end if;
711elsif NextCtx=10 then
712                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
713                count:=Interf.S.IntState1;
714                Writemem(count,interf,SysRam,AdrWin+3,base(15 downto 8)); --adresse haute
715                Interf.S.IntState1<=count;
716                if count=0 then
717                        NextCtx:=NextCtx+1;
718                end if;
719elsif NextCtx=11 then
720                AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
721                sizewin:=std_logic_vector(to_unsigned(size,8));
722                count:=Interf.S.IntState1;
723                Writemem(count,interf,SysRam,AdrWin+4,sizewin); -- taille de la fenêtre
724                Interf.S.IntState1<=count;
725                if count=0 then
726                        NextCtx:=NextCtx+1;
727                end if;
728elsif NextCtx=12 then   
729        --cette étape consiste à envoyer le message WINCREATE Sur le réseau et à récupérer
730        -- les informations donnant le numéro de la fenêtre
731                W0:=MPI_WIN_CREATE & std_logic_vector(to_unsigned(0,4)); --code fonction
732                count:=Interf.S.IntState1;
733                Writemem(count,interf,SysRam,wcreate_adr,w0);
734                Interf.S.IntState1<=count;
735                if count=0 then
736                        NextCtx:=NextCtx+1;
737                end if;
738               
739        elsif NextCtx=13 then 
740                w0:=std_logic_vector(to_unsigned(Win.Id,8));                                                    -- id proposé pour la fenêtre en création
741                count:=Interf.S.IntState1;
742                Writemem(count,interf,SysRam,wcreate_adr+1,w0);
743                Interf.S.IntState1<=count;
744                if count=0 then
745                        NextCtx:=NextCtx+1;
746                end if;
747        elsif NextCtx=14 then
748                SysRam.O.we<='1';
749                SysRam.O.ena<='1';
750                SysRam.O.enb<='0';
751                count:=Interf.S.IntState1;
752                if interf.I.ramsel='0' then
753                        WritePtr (wcreate_adr,count,SysRam); --écriture du pointeur d'instruction
754                        Interf.S.IntState1<=count;
755                        if count=0 then
756                                NextCtx:=NextCtx+1;
757                        end if;
758                end if;
759        elsif NextCtx=15 then
760                                                                        -- il faut mettre instruction_en à 1
761                                SysRam.O.we<='0';
762                                SysRam.O.ena<='0';
763                                SysRam.O.enb<='1';
764                                SysRam.O.we<='1';
765                                SysRam.O.ena<='1';
766                                SysRam.O.enb<='1';
767                                adresse:=stdlv(core_base_adr+1);
768                                                                SysRam.O.addr_rd<=adresse;
769                                                                SysRam.O.Addr_wr<=adresse;
770                                                                SysRam.O.Data_in<=x"01"; --instruction pulse enable via la mémoire;
771                Writemem(count,interf,SysRam,adresse,x"01");
772                Interf.S.IntState1<=count;
773                if count=0 then
774                        NextCtx:=NextCtx+1;
775                end if;
776                                Interf.O.Instr_En<='1';
777                                adresse:=stdlv(core_base_adr);
778                                SysRam.O.Addr_rd<=adresse;
779                                NextCtx:=NextCtx+1;
780        elsif NextCtx=16 then --acquittement de la copie des données dans le tampon de la lib
781                                if Interf.I.Instr_ack='1' then
782                                        Interf.O.Instr_En<='0';
783                                        NextCtx:=NextCtx+1;
784                                end if;
785                                SysRam.O.we<='0';
786                                SysRam.O.ena<='0';
787                                SysRam.O.enb<='1';
788        elsif NextCtx=17 then
789                        -- lecture du résultat de l'instruction
790                       
791       
792else
793       
794end if;
795end procedure;
796--int MPI_Win_start(
797--  MPI_Group group,
798--  int assert,
799--  MPI_Win win
800--);
801procedure 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
802--cette fonction active les bits WStart pour chaque processus avec lequel
803-- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
804--chacune de ces cibles
805 variable dcount : natural range 0 to 255:=0;
806 variable cstatus : std_logic_vector(Word-1 downto 0);
807 begin
808
809 -- retour de l'adresse de de la fenêtre dans la structure Win
810 -- initialisation des bits concernant
811 
812 if NextCtx =0 then 
813                        NextCtx:=NextCtx+1;
814                elsif NextCtx=1 then
815                        if interf.I.ramsel='0' then
816                                        SysRam.O.we<='1';
817                                        SysRam.O.ena<='1';
818                                        SysRam.O.enb<='0';
819                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
820                                        SysRam.O.Data_in<=x"01"; --mise à 1 du bit WSTART et remise à zero de tous les autres Bits     
821                                                       
822                                        NextCtx:=NextCtx+1;
823                                        Interf.O.membusy<='1';         
824                                        Interf.S.GStart<=(others=>'0');                         
825                        end if;
826        elsif NextCtx=2 then
827                        if interf.I.ramsel='0' then
828                                        SysRam.O.we<='1';
829                                        SysRam.O.ena<='1';
830                                        SysRam.O.enb<='0';
831                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
832                                        SysRam.O.Data_in<=x"01";
833                                        NextCtx:=NextCtx+1;
834                                        Interf.O.membusy<='1'; 
835                        end if;
836                elsif NextCtx=3 then
837                        if interf.I.ramsel='0' then
838                                        SysRam.O.we<='1';
839                                        SysRam.O.ena<='1';
840                                        SysRam.O.enb<='0';
841                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
842                                        SysRam.O.Data_in<=x"01";
843                                        NextCtx:=NextCtx+1;
844                                        Interf.O.membusy<='1'; 
845                        end if;
846        elsif NextCtx=4 then
847                NextCtx:=0;
848                Interf.O.membusy<='0';
849                SysRam.O.we<='0';
850                SysRam.O.ena<='0';
851        end if;
852
853 
854 end procedure;
855procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
856variable adresse :natural;
857variable wcount: natural range 0 to 255:=0;
858variable LRam : typ_dpRam;
859variable SyncDest,i : natural range 0 to 15; --destination du message de synchronisation
860variable W0 :std_logic_vector(Word-1 downto 0);
861variable wcompl_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
862
863begin
864  --
865                                wcompl_adr:=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
866                                LRam:=SysRam; -- nécessaire pour le débogage
867                                if NextCtx =0 then
868                                       
869                                        SysRam.O.we<='0';
870                                        SysRam.O.ena<='0';
871                                        SysRam.O.enb<='0';
872                                        Interf.O.MemBusy<='1'; --occuper la mémoire
873                                        Interf.S.IntState1<=0;
874                                        NextCtx:=1;
875                                        adresse:=core_wcompl_adr;
876                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
877                                        Interf.O.Instr_En<='0';
878                                       
879                                elsif NextCtx=1 then --écriture du ptr d'intruction
880                                        SysRam.O.we<='1';
881                                        SysRam.O.ena<='1';
882                                        SysRam.O.enb<='0';
883                                        if interf.I.ramsel='0' then
884                                       
885                                        adresse:=core_wcompl_adr;
886                               
887                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
888                                        Interf.O.Instr_En<='0';
889                                        Interf.O.membusy<='1';
890                                        SysRam.O.we<='1';
891                                        SysRam.O.ena<='1';
892                                  wcount:=Interf.S.IntState1;
893          WritePtr (wcompl_adr,wcount,SysRam); --attn cette fonction ne met pas à jour (we et ena) ! a voir
894          Interf.S.IntState1<=wcount;
895         
896            if wcount =0 then 
897                  NextCtx:=2;
898                  Interf.S.IntState1<=0;
899                  Interf.S.IntState2<=0;
900                  Interf.S.tmem(0)<=Interf.S.GStart(7 downto 0); --cibles impactées
901                  Interf.S.tmem(1)<=Interf.S.GStart(15 downto 8); --cibles impactées
902                  adresse:=core_wcompl_adr;
903                  SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
904            end if;     
905      else
906        Interf.S.IntState1<=0; --recommencer l'écriture du pointeur     
907         end if;       
908                                elsif NextCtx=2 then 
909                                        if      Interf.I.Ramsel='0' then
910                                        SysRam.O.we<='1';
911                                        SysRam.O.ena<='1';
912                                        SysRam.O.enb<='0';
913                                        Interf.O.membusy<='1';
914                                  adresse:=core_wcompl_adr;
915                                  NextCtx:=10; --aller à la fin de la fonction
916                                  i:=0;
917                                  l1:for i in 0 to 7 loop
918                                  --  i:=i+1;
919                                  if i>=interf.s.intState2 then                                   
920                                  if interf.s.gstart(i)='1' then
921                                        SysRam.O.Data_in<=MPI_WIN_SYNC & std_logic_vector(to_unsigned(i,4));
922                                        Interf.S.tmem(2)<=MPI_WIN_SYNC & std_logic_vector(to_unsigned(i,4));
923
924                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
925                                        Interf.S.tmem(0)(i)<='0'; --ce dest a été traité !
926                                        NextCtx:=4;
927                                        Interf.S.IntState2<=i+1;
928                                        exit l1;
929                                        end if;
930                                        end if;
931                                        exit l1 when i=7;
932                                        end loop l1;
933                                        end if;
934                                elsif NextCtx=3 then 
935                                        if interf.I.ramsel='0' then
936                                        SysRam.O.we<='1';
937                                        SysRam.O.ena<='1';
938                                        SysRam.O.enb<='0';
939                                        Interf.O.membusy<='1'; 
940                                  adresse:=core_wcompl_adr;
941                                  wcount:=Interf.S.IntState1;
942          WritePtr (wcompl_adr,wcount,SysRam); --attn cette fonction ne met pas à jour (we et ena) ! a voir
943          Interf.S.IntState1<=wcount;
944                                        SysRam.O.Data_in<= Interf.S.tmem(2);
945                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
946                                        if wcount=0 then 
947                                         NextCtx:=NextCtx+1;
948                                         end if;
949                                        end if;
950                                elsif NextCtx=4 then 
951                                        SysRam.O.we<='1';
952                                        SysRam.O.ena<='1';
953                                        SysRam.O.enb<='0';
954                                        Interf.O.membusy<='1'; 
955                                  adresse:=core_wcompl_adr+1;
956                                        SysRam.O.Data_in<= x"04" ;
957                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
958                                        NextCtx:=NextCtx+1;
959                                elsif NextCtx=5 then 
960                                        SysRam.O.we<='1';
961                                        SysRam.O.ena<='1';
962                                        SysRam.O.enb<='0';
963                                        Interf.O.membusy<='1';
964                                        adresse:=core_wcompl_adr+2;
965                                  Interf.O.Instruction<=x"04";--longueur de l'instruction
966                                        SysRam.O.Data_in<=x"00" ;--
967                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
968                                        NextCtx:=6;
969                                elsif NextCtx=6 then 
970                                        SysRam.O.we<='1';
971                                        SysRam.O.ena<='1';
972                                        SysRam.O.enb<='0';
973                                        Interf.O.membusy<='1';
974                                  adresse:=core_wcompl_adr+3;
975                                        SysRam.O.Data_in<= SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
976                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
977                                        NextCtx:=7;
978                                elsif NextCtx=7 then 
979                                        SysRam.O.we<='1';
980                                        SysRam.O.ena<='1';
981                                        SysRam.O.enb<='0';
982                                  adresse:=core_wcompl_adr+3;
983                                        SysRam.O.Data_in<=SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
984                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
985                                        NextCtx:=NextCtx+1;
986
987                                elsif NextCtx=8 then --fin de la fonction
988                                                        SysRam.O.we<='0';
989                                                        SysRam.O.ena<='0';
990                                                        SysRam.O.enb<='1';
991                                                        --dcount:=0;
992                                                        Interf.O.membusy<='0';
993                                                        Interf.O.Instr_En<='1';
994                                                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr+5,AdrLen));
995                                                        NextCtx:=NextCtx+1;
996                                elsif NextCtx=9 then --acquittement de la copie des données dans le tampon
997                                                        if Interf.I.Instr_ack='1' then
998                                                                Interf.O.Instr_En<='0';
999                                                                NextCtx:=10;
1000                                                        end if;
1001                                                        SysRam.O.we<='0';
1002                                                        SysRam.O.ena<='0';
1003                                                        SysRam.O.enb<='1';
1004                                                       
1005                                elsif NextCtx=10 then --lecture de la fin de WComplete
1006                                                        SysRam.O.we<='0';
1007                                                        SysRam.O.ena<='0';
1008                                                        SysRam.O.enb<='1';
1009                                                        Interf.O.membusy<='0';
1010                                                        if interf.S.IntState2=0 then --aucune instruction MPI exécutée ?
1011                                                          NextCtx:=12;
1012                                                        elsif Interf.S.tmem(0)/=0 then --plus de message compl à envoyer
1013                                                           NextCtx:=2;
1014                                                         elsif Interf.S.tmem(0)=0 then
1015                                                           if interf.I.ramsel='0' then
1016                                                               NextCtx:=NextCtx+1;
1017                                                                   SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
1018                                                           end if;
1019                                                         end if; 
1020                                elsif NextCtx=11 then --test de la fin des transferts
1021                                        if interf.I.ramsel='0' then
1022                                                SysRam.O.we<='0';
1023                                                SysRam.O.ena<='0';
1024                                                SysRam.O.enb<='1';
1025                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
1026                                                                if SysRam.I.Data_out(0)='1' and  SysRam.I.Data_out(6)='0' then --si WStart=1 et Wbusy=0
1027                                                                  --il faut un DSent=1 pour Put ou un DSending pour Get
1028                                                                                if SysRam.I.Data_out(5)='1' or  (SysRam.I.Data_out(4)='1' and SysRam.I.Data_out(1)='1')  then 
1029                                                                                                NextCtx:=NextCtx+1;
1030                                                                                end if; 
1031                                                                        end if;                                                                 
1032                               
1033                                        end if; 
1034                                elsif NextCtx=12 then
1035                                                                        Interf.S.IntState1<=0; -- initialisation du compteur d'état
1036                                                                Interf.S.IntState2<=0;
1037                                                                        SysRam.O.enb<='0';
1038                                                                NextCtx:=0; --fin de la fonction                       
1039      end if;
1040
1041end procedure;
1042procedure 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
1043--cette fonction active les bits WStart pour chaque processus avec lequel
1044-- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
1045--chacune de ces cibles
1046 variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire
1047 variable dcount : natural range 0 to 255:=0;
1048 variable cstatus : std_logic_vector(Word-1 downto 0);
1049 begin
1050
1051 -- retour de l'adresse de de la fenêtre dans la structure Win
1052 -- initialisation des bits concernant
1053 if Win.id =0 then
1054   W_ptr:=Core_Base_Adr+4;
1055 end if;
1056 if NextCtx =0 then 
1057                       
1058                        if pgroup.grp=0 then --rien à faire
1059                          nextCtx:=5;
1060                          Interf.S.GPost<=(others=>'0');
1061                         else
1062                           NextCtx:=NextCtx+1;
1063                        end if;
1064                elsif NextCtx=1 then
1065                        if interf.I.ramsel='0' then
1066                                        SysRam.O.we<='1';
1067                                        SysRam.O.ena<='1';
1068                                        SysRam.O.enb<='0';
1069                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
1070                                        SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits     
1071                                                       
1072                                        NextCtx:=NextCtx+1;
1073                                        Interf.O.membusy<='1';         
1074                                                                       
1075                        end if;
1076                         --limitation de cete version à 16 rang
1077                                Interf.S.GPost<=pgroup.grp;
1078        elsif NextCtx=2 then
1079                        if interf.I.ramsel='0' then
1080                                        SysRam.O.we<='1';
1081                                        SysRam.O.ena<='1';
1082                                        SysRam.O.enb<='0';
1083                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
1084                                        SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits     
1085                                                       
1086                                        NextCtx:=NextCtx+1;
1087                                        Interf.O.membusy<='1';         
1088                                                                       
1089                        end if;                                         
1090        elsif NextCtx=3 then
1091                        if interf.I.ramsel='0' then
1092                                        SysRam.O.we<='1';
1093                                        SysRam.O.ena<='1';
1094                                        SysRam.O.enb<='0';
1095                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_Ptr+W_Gpost,Adrlen));
1096                                        SysRam.O.Data_in<=pgroup.grp(7 downto 0);
1097                                        NextCtx:=NextCtx+1;
1098                                        Interf.O.membusy<='1'; 
1099                        end if;
1100elsif NextCtx=4 then
1101                        if interf.I.ramsel='0' then
1102                                        SysRam.O.we<='1';
1103                                        SysRam.O.ena<='1';
1104                                        SysRam.O.enb<='0';
1105                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
1106                                        SysRam.O.Data_in<=pgroup.grp(15 downto 8);
1107                                        NextCtx:=NextCtx+1;
1108                                        Interf.O.membusy<='1'; 
1109                        end if;
1110elsif NextCtx=6 then
1111                        if interf.I.ramsel='0' then
1112                                        SysRam.O.we<='1';
1113                                        SysRam.O.ena<='1';
1114                                        SysRam.O.enb<='0';
1115                                        SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
1116                                        SysRam.O.Data_in<=pgroup.grp(15 downto 8);
1117                                        NextCtx:=NextCtx+1;
1118                                        Interf.O.membusy<='1'; 
1119                        end if;
1120        elsif NextCtx=5 then
1121                 SysRam.O.we<='0';
1122                                        SysRam.O.ena<='0';
1123                                        SysRam.O.enb<='0';
1124                NextCtx:=0;
1125                Interf.O.membusy<='0';
1126        end if;
1127
1128 
1129 end procedure;
1130 
1131 procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
1132--permet de synchroniser la fin des opérations sur une fenêtre
1133variable dcount : natural range 0 to 255:=0;
1134variable cstatus : std_logic_vector(Word-1 downto 0);
1135variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire
1136begin
1137        W_Ptr:=Core_base_adr+4;--adresse du reg status de la première fenêtre
1138                if NextCtx =0 then 
1139                        NextCtx:=NextCtx+1;
1140                elsif NextCtx=1 then
1141                        if interf.I.ramsel='0' then
1142                                        SysRam.O.we<='0';
1143                                        SysRam.O.ena<='0';
1144                                        SysRam.O.enb<='1';
1145                                        NextCtx:=NextCtx+1;
1146                        end if;
1147                             SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
1148            If Interf.S.Gpost=0 then
1149             NextCtx:=5; --rien à synchroniser
1150          end if;
1151  elsif (NextCtx>=2) and (NextCtx <=3) then
1152    SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
1153    if interf.I.ramsel='0' then
1154                                        SysRam.O.we<='0';
1155                                        SysRam.O.ena<='0';
1156                                        SysRam.O.enb<='1';
1157                                        NextCtx:=NextCtx+1;
1158                else
1159                    NextCtx:=1;
1160                   end if;
1161                elsif NextCtx=4 then
1162                        if interf.I.ramsel='0' then
1163                                        SysRam.O.we<='0';
1164                                        SysRam.O.ena<='0';
1165                                        SysRam.O.enb<='1';
1166                                        SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
1167                                               
1168                                                        if SysRam.I.Data_out(3)='1' and SysRam.I.Data_out(6)='0' then --si WPost=1 et WBusy=0
1169                                                          --il faut un DSent=1 pour Put ou un DSending pour Get
1170                                                           if SysRam.I.Data_out(4)='1' or  (SysRam.I.Data_out(5)='1' and SysRam.I.Data_out(2)='1')  then 
1171                                                                           NextCtx:=NextCtx+1;
1172                                                                           Interf.S.GPost<=(others=>'0');
1173                                                           end if;     
1174                                                        elsif SysRam.I.Data_out(3)='0' then 
1175                                                                  NextCtx:=NextCtx; --pas d'opérations en attente
1176                                                        else
1177                                                          NextCtx:=NextCtx; --on attend
1178                                                        end if; 
1179                        else
1180                         NextCtx:=2;            --retour à l'atente du Bit !
1181                        end if; 
1182       
1183        elsif NextCtx=5 then
1184                      SysRam.O.we<='0';
1185                                        SysRam.O.ena<='0';
1186                                        SysRam.O.enb<='0';
1187                                        Interf.O.membusy<='0';
1188                      NextCtx:=0;
1189        end if;
1190
1191
1192end procedure;
1193
1194
1195 Procedure pMPI_Finalize(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram) is
1196  begin
1197 
1198 end procedure;
1199 
1200 procedure pMPI_Comm_Spawn(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; 
1201command : natural;  argv :natural; maxprocs : natural;  info : natural; root : natural;   comm : natural; 
1202signal intercomm :out natural; signal  array_of_errcodes : out natural) is
1203
1204variable i,dcount : natural:=0; 
1205variable adresse :natural;
1206variable spawn_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_spawn_adr,ADRLEN));
1207begin
1208 spawn_adr:=Std_logic_vector(to_unsigned(Core_spawn_adr,ADRLEN));
1209                                if NextCtx =0 then
1210                                       
1211                                        SysRam.O.we<='1';
1212                                        SysRam.O.ena<='1';
1213                                        SysRam.O.enb<='0';
1214                                        NextCtx:=1;
1215                                elsif NextCtx=1 then 
1216                                        if interf.I.ramsel='0' then
1217                                        NextCtx:=2;
1218                                        adresse:=core_spawn_adr;
1219                                        SysRam.O.Data_in<=MPI_SPAWN & x"0" ;
1220                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1221                                        Interf.O.membusy<='1';
1222                                        Interf.O.Instr_En<='0';
1223                                        Interf.S.IntState2<=1; -- préparation de la destination du spawn
1224                                        end if;
1225                                elsif NextCtx=2 then
1226                                        SysRam.O.we<='1';
1227                                        SysRam.O.ena<='1';
1228                                        SysRam.O.enb<='0';
1229                                        if interf.I.ramsel='0' then
1230                                        NextCtx:=NextCtx+1;
1231                                        Interf.O.membusy<='1';
1232                                        adresse:=core_spawn_adr;
1233                                        if interf.I.ismain='1' then ---déclanche l'éxécution de la commande
1234                                                SysRam.O.Data_in<=MPI_spawn & x"0";--Std_logic_vector(to_unsigned(Interf.S.IntState2+2,4)) ;
1235                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1236                                               
1237                                        else -- envoie d'une commande spawn à la main lib
1238                                                SysRam.O.Data_in<=MPI_spawn & x"0" ;
1239                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1240                                                Interf.O.Instr_En<='0';
1241                                                Interf.O.membusy<='1';
1242                                               
1243                                                end if;
1244                                        end if;
1245                               
1246                                elsif NextCtx=3 then 
1247                                        SysRam.O.we<='1';
1248                                        SysRam.O.ena<='1';
1249                                        SysRam.O.enb<='0';
1250                                        adresse:=core_spawn_adr;
1251                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1252                                        NextCtx:=NextCtx+1;
1253                                elsif NextCtx=4 then   
1254                                        if interf.I.ramsel='0' then
1255                                                                adresse:=core_spawn_adr+1;
1256                                                                SysRam.O.Data_in<=std_logic_vector(to_unsigned(4,8)) ;--la longueur
1257                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1258                                                                Interf.O.Instruction<=x"04";
1259                                                                NextCtx:=NextCtx+1;
1260                                        end if;
1261                                elsif NextCtx=5 then
1262                                        if interf.I.ramsel='0' then
1263                                                                adresse:=core_spawn_adr+2;
1264                                                                SysRam.O.Data_in<=std_logic_vector(to_unsigned(maxprocs,8)) ;--le nombre de processus
1265                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1266                                                                NextCtx:=NextCtx+1;
1267                                        end if;
1268                                elsif NextCtx=6 then
1269                                        if interf.I.ramsel='0' then
1270                                                                adresse:=core_spawn_adr+3;
1271                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1272                                                                SysRam.O.Data_in<=SPAWN_LOAD & std_logic_vector(to_unsigned(maxprocs,4)) ;--l'instruction
1273                                                                NextCtx:=NextCtx+1;
1274
1275                                        end if;
1276                                elsif NextCtx=7 then
1277                                        if interf.I.ramsel='0' then
1278                                                                adresse:=core_spawn_adr+3;
1279                                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1280                                                                SysRam.O.Data_in<=SPAWN_LOAD & std_logic_vector(to_unsigned(maxprocs,4)) ;--l'instruction
1281                                                                NextCtx:=NextCtx+1;
1282                report "MPV SPAWN activé " & integer'image(interf.I.Rank);
1283                                        end if;
1284                                elsif NextCtx=8 then
1285                                        SysRam.O.we<='1';
1286                                        SysRam.O.ena<='1';
1287                                        SysRam.O.enb<='0';
1288                                        dcount:=Interf.S.IntState1;
1289                                        if interf.I.ramsel='0' then
1290                                                SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,ADRLEN));
1291                                                WritePtr (spawn_adr,dcount,SysRam);
1292                                                Interf.O.Instr_En<='0';
1293                                                Interf.O.membusy<='1';
1294                                                Interf.S.IntState1<=dcount;
1295                                                if dcount =0 then 
1296                                                                NextCtx:=NextCtx+1;
1297                                                end if;
1298                                        end if;
1299                                elsif NextCtx=9 then
1300                       
1301                                 --fin de la fonction
1302                                                        SysRam.O.we<='0';
1303                                                        SysRam.O.ena<='0';
1304                                                        SysRam.O.enb<='1';
1305                                                        dcount:=0;
1306                                                        Interf.O.membusy<='0';
1307                                                        Interf.O.Instr_En<='1';
1308                                                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,AdrLen));
1309                                                        NextCtx:=NextCtx+1;
1310                                elsif NextCtx=10 then --acquittement de la copie des données dans le tampon
1311                                                        if Interf.I.Instr_ack='1' then
1312                                                                Interf.O.Instr_En<='0';
1313                                                                NextCtx:=NextCtx+1;
1314                                                        end if;
1315                                                        SysRam.O.we<='0';
1316                                                        SysRam.O.ena<='0';
1317                                                        SysRam.O.enb<='1';
1318                                elsif NextCtx=11 then --lecture de la fin de l'initialisation
1319                                                        SysRam.O.we<='0';
1320                                                        SysRam.O.ena<='0';
1321                                                        SysRam.O.enb<='1';
1322                                                        adresse:=core_spawn_adr+7; 
1323                                                        SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
1324                                                        if interf.I.ramsel='0' then     
1325                                                                        NextCtx:=NextCtx+1;
1326                                                        end if;
1327                       
1328                                elsif NextCtx=12 then --lecture de la fin de l'initialisation
1329                                                        SysRam.O.we<='0';
1330                                                        SysRam.O.ena<='0';
1331                                                        SysRam.O.enb<='1';
1332                                                        adresse:=core_spawn_adr+7;
1333                                                        if interf.I.ramsel='0' then 
1334                                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
1335                                                                if SysRam.I.Data_out(5)='1' then  --spawned
1336                                                                        NextCtx:=NextCtx+1;
1337                                                                        intercomm<=1;
1338                                                                end if;
1339                                                                Interf.O.membusy<='0';
1340                                                  else
1341                                                    NextCtx:=11;
1342                                                        end if; 
1343                                elsif NextCtx=13 then --lecture de la fin de l'initialisation
1344                                                        SysRam.O.we<='0';
1345                                                        SysRam.O.ena<='0';
1346                                                        SysRam.O.enb<='1';
1347                                                        adresse:=core_spawn_adr+8;
1348                                                        if interf.I.ramsel='0' then 
1349                                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
1350                                                                Intercomm<=conv_integer(SysRam.I.Data_out);-- le groupe des Ht Fils
1351                                                                NextCtx:=NextCtx+1;
1352                                                                       
1353                                                        end if;
1354                                                                Interf.O.membusy<='0';
1355                                                               
1356                                elsif NextCtx=14 then --lecture de la fin de l'initialisation
1357                                                        SysRam.O.we<='0';
1358                                                        SysRam.O.ena<='0';
1359                                                        SysRam.O.enb<='1';
1360                                                        adresse:=core_spawn_adr+8;
1361                                                        if interf.I.ramsel='0' then 
1362                                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
1363                                                                Intercomm<=conv_integer(SysRam.I.Data_out);-- le groupe des Ht Fils                                                                     
1364                                                                NextCtx:=NextCtx+1;
1365                                                               
1366                                                                end if;
1367                                                                Interf.O.membusy<='0';
1368                                                                                                                       
1369                                elsif NextCtx =15 then
1370                                                        Interf.O.Instr_En<='0';
1371                                                        Interf.O.membusy<='0';
1372                                                        SysRam.O.we<='0';
1373                                                        SysRam.O.ena<='0';
1374                                                        SysRam.O.enb<='0';
1375                                                        NextCtx:=0;
1376                                                        --array_of_errcodes<=0;
1377                                end if;
1378                                array_of_errcodes<=NextCtx;
1379 end procedure;
1380 
1381procedure pMPI_INIT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram) is
1382variable i,dcount,wcount : natural range 0 to 255:=0;   
1383variable adresse :natural;
1384variable LRam : typ_dpRam;
1385variable W0 :std_logic_vector(Word-1 downto 0);
1386variable init_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_init_adr,ADRLEN));
1387begin
1388                                init_adr:=Std_logic_vector(to_unsigned(Core_init_adr,ADRLEN));
1389                                LRam:=SysRam; -- nécessaire pour le débogage
1390                                if NextCtx =0 then
1391                                       
1392                                        SysRam.O.we<='1';
1393                                        SysRam.O.ena<='1';
1394                                        SysRam.O.enb<='0';
1395                                        Interf.S.IntState1<=0;
1396                                        NextCtx:=1;
1397                                        adresse:=core_init_adr;
1398                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1399                                        Interf.O.Instr_En<='0';
1400                                       
1401                                elsif NextCtx=1 then --écriture du ptr d'intruction
1402                                        SysRam.O.we<='1';
1403                                        SysRam.O.ena<='1';
1404                                        SysRam.O.enb<='0';
1405                                        if interf.I.ramsel='0' then
1406                                       
1407                                        adresse:=core_init_adr;
1408                               
1409                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1410                                        Interf.O.Instr_En<='0';
1411                                        Interf.O.membusy<='1';
1412                                       
1413                                  wcount:=Interf.S.IntState1;
1414          WritePtr (Init_adr,wcount,SysRam);
1415          Interf.S.IntState1<=wcount;
1416         
1417            if wcount =0 then 
1418                  NextCtx:=2;
1419                  Interf.S.IntState1<=0;
1420                  adresse:=core_init_adr;
1421                  SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1422            end if;             
1423         end if;       
1424                                elsif NextCtx=2 then 
1425                                  if interf.I.ramsel='0' then
1426                                           SysRam.O.we<='1';
1427                                           SysRam.O.ena<='1';
1428                                           SysRam.O.enb<='0';
1429                                      adresse:=core_init_adr;
1430                                           SysRam.O.Data_in<=MPI_INIT & x"0" ;
1431                                           SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1432                                           NextCtx:=3;
1433                                           Interf.O.membusy<='1';
1434                                        end if;
1435                                elsif NextCtx=3 then 
1436                                  if Interf.I.ramSel='0' then
1437                                        SysRam.O.we<='1';
1438                                        SysRam.O.ena<='1';
1439                                        SysRam.O.enb<='0';
1440                                        Interf.O.membusy<='1';
1441                                  adresse:=core_init_adr+1;
1442                                        SysRam.O.Data_in<= x"04" ;
1443                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1444                                        NextCtx:=NextCtx+1;
1445                                        end if;
1446                                elsif NextCtx=4 then 
1447                                  if Interf.I.ramSel='0' then
1448                                        SysRam.O.we<='1';
1449                                        SysRam.O.ena<='1';
1450                                        Interf.O.membusy<='1';
1451                                        SysRam.O.enb<='0';
1452                                        adresse:=core_init_adr+1;
1453                                  Interf.O.Instruction<=x"04";
1454                                        SysRam.O.Data_in<=x"04" ;--longueur de l'instruction
1455                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1456                                        NextCtx:=5;
1457                                        end if;
1458                                elsif NextCtx=5 then 
1459                                  if Interf.I.ramSel='0' then
1460                                        SysRam.O.we<='1';
1461                                        SysRam.O.ena<='1';
1462                                        Interf.O.membusy<='1';
1463                                        SysRam.O.enb<='0';
1464                                  adresse:=core_init_adr+2;
1465                                        SysRam.O.Data_in<= x"00" ;
1466                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1467                                        NextCtx:=6;
1468                                        end if;
1469                                elsif NextCtx=6 then 
1470                                  if Interf.I.ramSel='0' then
1471                                        SysRam.O.we<='1';
1472                                        SysRam.O.ena<='1';
1473                                        SysRam.O.enb<='0';
1474                                        Interf.O.membusy<='1';
1475                                  adresse:=core_init_adr+3;
1476                                        SysRam.O.Data_in<=x"00" ;
1477                                        SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1478                                        NextCtx:=7;
1479        end if;
1480                                elsif NextCtx=7 then --fin de la fonction
1481                                                        SysRam.O.we<='0';
1482                                                        SysRam.O.ena<='0';
1483                                                        SysRam.O.enb<='1';
1484                                                        Interf.O.membusy<='0';
1485                                                        dcount:=0;
1486                                                        Interf.O.membusy<='0';
1487                                                        Interf.O.Instruction(6)<=Interf.I.Spawned; --- préciser que la HT est dynamique
1488                                                        Interf.O.Instr_En<='1';
1489                                                        SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,AdrLen));
1490                                                        NextCtx:=8;
1491                                elsif NextCtx=8 then --acquittement de la copie des données dans le tampon
1492                                                        if Interf.I.Instr_ack='1' then
1493                                                                Interf.O.Instr_En<='0';
1494                                                                NextCtx:=9;
1495                                                        end if;
1496                                                        SysRam.O.we<='0';
1497                                                        SysRam.O.ena<='0';
1498                                                        SysRam.O.enb<='1';
1499                                                       
1500                                elsif NextCtx=9 then --lecture de la fin de l'initialisation
1501                                                        SysRam.O.we<='0';
1502                                                        SysRam.O.ena<='0';
1503                                                        SysRam.O.enb<='1';
1504                                                        if interf.I.ramsel='0' then 
1505                                                                SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,Adrlen));
1506                                                                if SysRam.I.Data_out(4)='1' then 
1507                                                                        NextCtx:=10;
1508                                                                        Interf.S.IntState1<=0; -- initialisation du compteur d'état
1509                                                                end if;
1510                                                                Interf.O.membusy<='0';
1511                                                        end if;                                                         
1512                                elsif NextCtx =10 then
1513                                                        dcount:=Interf.S.IntState1; --permet de sauvegarder l'état interne du compteur
1514                                                        readmem(dcount,interf,sysRam,init_Adr,w0);
1515                                                        Interf.S.IntState1<=dcount;
1516                                                        w0:=SysRam.I.Data_out;
1517                                                        if dcount=0 then
1518                                                                Interf.I.ismain<=all_zeros(SysRam.I.Data_out(3 downto 0));--Rank=0 -> MainLib
1519                                                                NextCtx:=NextCtx+1;
1520                                                        end if;                                                         
1521                                elsif NextCtx =11 then
1522                                                        Interf.O.Instr_En<='0';
1523                                                        Interf.O.membusy<='0';
1524                                                        SysRam.O.we<='0';
1525                                                        SysRam.O.ena<='0';
1526                                                        SysRam.O.enb<='0';
1527                                                        NextCtx:=0;
1528                                end if;
1529                                                       
1530                               
1531end procedure;
1532
1533
1534procedure WriteMem(NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
1535                                                AdrVect:in std_logic_vector; Data:in std_logic_vector) is
1536--cette procédure permet d'écrire un mot dans la mémoire du PE(tâche matérielle)
1537--en ayant vérifié que le bus est bien disponible pour l'écriture
1538 variable i,dcount : natural:=0;       
1539variable adresse :natural;
1540variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
1541
1542begin
1543                                if NextCtx /=0 then --préserver la valeur de count entre les appels
1544                                        dcount:=NextCtx;
1545                                else
1546                                       
1547                                       
1548                                end if;
1549                               
1550                                                       
1551                                if dcount=0 then
1552                                        if interf.I.ramsel='0' then 
1553                                                dcount :=dcount+1;
1554                                                Interf.O.membusy<='1';
1555                                        end if;
1556                                                SysRam.O.Data_in<=AdrToSet(Word-1 downto 0);                                   
1557                                                SysRam.O.Addr_wr<=adrToSet;
1558                                elsif dcount=1 then
1559                                                if interf.I.ramsel='0' then 
1560                                                        Interf.O.membusy<='1';
1561                                                        dcount :=dcount+1;
1562                                                end if;
1563                                                SysRam.O.Data_in<=data;
1564                                                SysRam.O.Addr_wr<=adrToSet;
1565                                elsif dcount=2 then
1566                                                SysRam.O.Data_in<=data;
1567                                                dcount :=dcount+1;
1568                                                SysRam.O.Addr_wr<=AdrToSet;
1569                                elsif dcount=3 then
1570                                                Interf.O.membusy<='1';
1571                                                dcount :=dcount+1;
1572                                                SysRam.O.Addr_wr<=adrToSet;
1573                                                SysRam.O.Data_in<=data;
1574                                elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
1575                                                dcount:=0;
1576                                                Interf.O.membusy<='0';
1577                                                SysRam.O.Addr_wr<=AdrToSet;             
1578                                end if;
1579                                       
1580                                        NextCtx:=dcount;
1581end procedure;
1582
1583-- écriture dans la mémoire
1584procedure ReadMem( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
1585                                                AdrVect:in std_logic_vector; data: out std_logic_vector) is
1586--cette procédure permet d'écrire un mot dans la mémoire du PE(tâche matérielle)
1587--en ayant vérifié que le bus est bien disponible pour l'écriture
1588 variable i,dcount : natural:=0;       
1589variable adresse :natural;
1590variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
1591
1592begin
1593                                if NextCtx /=0 then --préserver la valeur de count entre les appels
1594                                        dcount:=NextCtx;
1595                                else
1596                                       
1597                                       
1598                                end if;
1599                                                       
1600                                if dcount=0 then
1601                                        if interf.I.ramsel='0' then 
1602                                                dcount :=dcount+1;
1603                                                Interf.O.membusy<='1';
1604                                        end if;
1605                                                                                       
1606                                                SysRam.O.Addr_rd<=adrToSet;
1607                                elsif dcount=1 then
1608                                                data:=SysRam.I.Data_out;
1609                                                dcount :=dcount+1;
1610                                                SysRam.O.Addr_rd<=adrToSet;
1611                                elsif dcount=2 then
1612                                                data:=SysRam.I.Data_out;
1613                                                dcount :=dcount+1;
1614                                                SysRam.O.Addr_rd<=adrToSet;
1615                                elsif dcount=3 then
1616                                                if interf.I.ramsel='0' then 
1617                                                dcount :=dcount+1;
1618                                                SysRam.O.Addr_rd<=adrToSet;
1619                                                data:=SysRam.I.Data_out;
1620                                                Interf.O.membusy<='0';
1621                                                end if;
1622                                elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
1623                                                dcount:=0;
1624                                                Interf.O.membusy<='0';
1625                                                data:=SysRam.I.Data_out;
1626                                end if;
1627                                        data:=SysRam.I.Data_out;
1628                                        NextCtx:=dcount;
1629end procedure;
1630
1631procedure SetBit( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
1632                variable                                AdrVect:in std_logic_vector(ADrLen-1 downto 0); variable BitMask: in std_logic_vector(Word-1 downto 0);bitval:in std_logic) is
1633--cette procédure permet de mettre à jour un Bit un mot dans la mémoire du PE(tâche matérielle)
1634--en ayant vérifié que le bus est bien disponible pour l'écriture
1635 variable i,dcount : natural:=0;       
1636variable adresse :natural;
1637variable tempdata:std_logic_vector(Word-1 downto 0);
1638
1639
1640begin
1641                                if NextCtx /=0 then --préserver la valeur de count entre les appels
1642                                        dcount:=NextCtx;
1643                                else
1644                                       
1645                                       
1646                                end if;
1647                                                       
1648                                if dcount=0 then
1649                                        if interf.I.ramsel='0' then 
1650                                                dcount :=dcount+1;
1651                                                Interf.O.membusy<='1';
1652                                        end if;
1653                                                                                       
1654                                                SysRam.O.Addr_rd<=adrVect;
1655                                                SysRam.O.Addr_Wr<=adrVect;
1656                                elsif dcount=1 then
1657                                        if interf.I.ramsel='0' then
1658                                                tempdata:=SysRam.I.Data_out;
1659                                                dcount :=dcount+1;
1660                                                SysRam.O.Addr_rd<=adrVect;
1661                                                end if;
1662                                                SysRam.O.enb<='1';
1663                                                SySRam.O.ena<='0';
1664                                                SysRam.O.we<='0';
1665                                elsif dcount=2 then
1666                                                tempdata:=SysRam.I.Data_out;
1667                                                dcount :=dcount+1;
1668                                                SysRam.O.Addr_rd<=adrVect;
1669                                                SysRam.O.enb<='1';
1670                                                SySRam.O.ena<='0';
1671                                                SysRam.O.we<='0';
1672                                elsif dcount=3 then
1673                                                if interf.I.ramsel='0' then 
1674                                                dcount :=dcount+1;
1675                                                SysRam.O.Addr_Wr<=adrVect;
1676                                                SysRam.O.We<='0';
1677                                                SysRam.O.ena<='0';
1678                                                SysRam.O.enb<='1';
1679                                                tempdata:=SysRam.I.Data_out;
1680                                                Interf.O.membusy<='1';
1681                                                end if;
1682                                elsif dcount=4 then
1683                                                if interf.I.ramsel='0' then 
1684                                                dcount :=dcount+1;
1685                                                SysRam.O.Addr_Wr<=adrVect;
1686                                                SysRam.O.We<='1';
1687                                                SysRam.O.ena<='1';
1688                                                SysRam.O.enb<='1';
1689                                                tempdata:=SysRam.I.Data_out;
1690                                                if BitVal='1' then
1691                                                  TempData:=Tempdata or BitMask;
1692                                                else
1693                                                 TempData:=TempData and not (BitMAsk);
1694                                                end if;
1695                                                SysRam.O.Data_in<=TempData;
1696                                                Interf.O.membusy<='1';
1697                                                end if;
1698                                elsif dcount=5 then --attente d'écriture
1699                                                if interf.I.ramsel='0' then 
1700                                                dcount :=dcount+1;
1701                                                SysRam.O.Addr_rd<=adrVect;
1702                                                SysRam.O.We<='1';
1703                                                SysRam.O.ena<='1';
1704                                                --SysRam.O.Data_in<=TempData;
1705                                                Interf.O.membusy<='1';
1706                                                end if;
1707                                elsif dcount=6 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
1708                                                dcount:=0;
1709                                                Interf.O.membusy<='0';
1710                                                SysRam.O.We<='0';
1711                                                SysRam.O.ena<='0';
1712                                               
1713                                end if;
1714                                       
1715                                        NextCtx:=dcount;
1716end procedure;
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733procedure WritePtr(AdrVect:in std_logic_vector; count: inout natural;signal SysRam :out typ_dpram) is
1734--cette procédure permet d'écrire dans la mémoire du PE(tâche matérielle)
1735--les données de l'appel de la procédure
1736variable i,dcount : natural:=0; 
1737variable adresse :natural;
1738variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
1739begin
1740                                if count /=0 then --préserver la valeur de count entre les appels
1741                                        dcount:=count;
1742                                else
1743                                       
1744                                       
1745                                end if;
1746                                adresse:=Core_base_adr+2;
1747                                AdrToSet:=AdrVect;     
1748                                if dcount=0 then
1749                                                SysRam.O.Data_in<=AdrToSet(Word-1 downto 0);
1750                                                dcount :=dcount+1;
1751                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1752                                elsif dcount=1 then
1753                                 
1754                                    SysRam.O.Data_in<=AdrToSet(Word-1 downto 0);
1755                                    SysRam.O.We<='1';SysRam.O.Ena<='1';
1756                                                dcount :=dcount+1;
1757                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
1758                                               
1759                                elsif dcount=2 then
1760                                    SysRam.O.We<='1';SysRam.O.Ena<='1';
1761                                    SysRam.O.Data_in<=AdrToSet(ADRLEN-1 downto Word);
1762                                                dcount :=dcount+1;
1763                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));
1764                                                SysRam.O.Data_in<=AdrToSet(ADRLEN-1 downto Word);
1765                                elsif dcount=3 then
1766                                                dcount :=dcount+1;
1767                                                SysRam.O.We<='1';SysRam.O.Ena<='1';
1768                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));
1769                                                SysRam.O.Data_in<=AdrToSet(ADRLEN-1 downto Word);
1770                                elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
1771                                                dcount:=0;
1772                                                SysRam.O.We<='0';SysRam.O.Ena<='0';
1773                                                SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));             
1774                                end if;
1775                                       
1776                                        count:=dcount;
1777end procedure;
1778end MPI_Rma;
Note: See TracBrowser for help on using the repository browser.