source: PROJECT_CORE_MPI/MPI_HCL/TRUNK/CORE_MPI/MPI_RMA.vhd.bak @ 100

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