Index: /PROJECT_CORE_MPI/MPI_HCL/BRANCHES/v2.1/CORE_MPI/MPI_RMA.vhd
===================================================================
--- /PROJECT_CORE_MPI/MPI_HCL/BRANCHES/v2.1/CORE_MPI/MPI_RMA.vhd	(revision 150)
+++ /PROJECT_CORE_MPI/MPI_HCL/BRANCHES/v2.1/CORE_MPI/MPI_RMA.vhd	(revision 150)
@@ -0,0 +1,1838 @@
+--	Package File Template
+--
+--	Purpose: This package defines supplemental types, subtypes, 
+--		 constants, and functions 
+
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.all;
+use ieee.numeric_std.all;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+Library NocLib;
+use NocLib.CoreTypes.all;
+use work.PACKET_TYPE.all;
+
+package Mpi_Rma is
+procedure WritePtr(AdrVect:in std_logic_vector; count: inout natural;signal SysRam :out typ_dpram);
+procedure pMPI_INIT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram);
+procedure pMPI_PUT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
+ Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
+  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
+  Target_Datatype :natural; Win : natural);
+
+procedure pMPI_GET(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
+ Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
+  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
+  Target_Datatype :natural; Win : natural);
+procedure 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 );
+
+procedure pMPI_Win_create(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+									base :std_logic_vector; size : Mpi_Aint;disp_unit:natural; 
+									info:natural; comm:Mpi_Comm; Win: inout MPI_Win );
+procedure pMPI_Win_start( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
+procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
+procedure pMPI_Win_post( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; pgroup:MPI_group;asser : natural; Win :MPI_Win);
+procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win);
+procedure pMPI_Comm_Spawn(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;  
+command : natural;  argv :natural; maxprocs : natural;  info : natural; root : natural;   comm : natural;  
+signal intercomm :out natural; signal  array_of_errcodes : out natural);
+-- declare functions and procedure	 
+procedure MPI_Alloc_mem(NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+SIZE : natural; MPI_INFO: natural; baseptr: out  std_logic_vector(ADRLEN-1 downto 0));
+ procedure ReadMem( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+						AdrVect:in std_logic_vector; data: out std_logic_vector);
+procedure WriteMem(NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+						AdrVect:in std_logic_vector; Data:in std_logic_vector);						
+
+procedure SetBit( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+				variable	AdrVect:in std_logic_vector(ADrLen-1 downto 0); variable BitMask: in std_logic_vector(Word-1 downto 0);bitval:in std_logic);
+
+end MPI_Rma;
+
+
+package body MPI_Rma is
+----int MPI_Put(
+--  void *origin_addr,
+--  int origin_count,
+--  MPI_Datatype origin_datatype,
+--  int target_rank,
+--  MPI_Aint target_disp,
+--  int target_count,
+--  MPI_Datatype target_datatype,
+--  MPI_Win win
+--);
+-- Example 1
+procedure pMPI_PUT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
+ Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
+  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
+  Target_Datatype :natural; Win : natural) is
+variable i,dcount,wr_state : natural:=0;
+variable adresse :natural;
+variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
+variable addr2 :std_logic_vector(Target_Disp'length-1 downto 0):=Target_Disp;
+variable put_adr : std_logic_vector (ADRLEN-1 downto 0);
+variable config_reg: std_logic_vector (Word-1 downto 0);
+constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
+	begin   
+				put_adr:=conv_Std_logic_vector(Core_put_adr,ADRLEN);
+				
+				addr1:=Orig_Addr;
+				addr2:=Target_Disp;
+				if NextCtx /=0 then --préserver la valeur de count entre les appels
+				dcount:=NextCtx;
+				end if;
+--					
+					
+--				if rising_edge(clkin) then		
+				  if dcount= 0 then
+				      dcount:=dcount+1;
+				      Interf.S.Intstate1<=0;
+				      Interf.O.Instruction<=x"00";
+					elsif dcount>=1 and dcount <=3 then 
+									if interf.I.ramsel='0' then
+											Interf.O.membusy<='0';
+											--SysRam.O.we<='1';
+											--SysRam.O.ena<='1';
+											SysRam.O.enb<='1';
+											wr_state:=interf.S.Intstate1;
+											WritePtr (put_adr,wr_state,SysRam);
+											interf.S.Intstate1<=wr_state;
+											if wr_state =0 then 
+												-- fin de l'écriture du pointeur en mémoire 
+											dcount:=4;
+											end if;								
+									end if;
+							
+							elsif dcount=4 then
+							if interf.I.ramsel='0' then
+								SysRam.O.we<='1';
+								SysRam.O.ena<='1';
+								SysRam.O.enb<='0';
+								Interf.O.membusy<='1';
+								if target_rank <=15 then --limitation de cete version à 16 rang
+								Interf.S.Gstart(Target_rank)<='1';
+								end if;
+								adresse:=core_put_adr;
+								SysRam.O.Data_in<=MPI_PUT & conv_std_logic_vector(Target_Rank,4); --code fonction
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								dcount:=dcount+1;
+							end if;
+							elsif dcount=5 then 
+								if interf.I.ramsel='0' then
+								adresse:=core_put_adr+1;
+								SysRam.O.Data_in<=std_logic_vector(to_unsigned(Orig_Count,8)) ;--la longueur
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								dcount:=dcount+1;
+								Interf.O.Instruction<=x"06"; -- nombre de mots de l'instruction
+								end if;
+							elsif dcount=6 then
+								if interf.I.ramsel='0' then
+								adresse:=core_put_adr+2;
+								SysRam.O.Data_in<= Addr1(ADRLEN-1 downto Word) ; --source Haut
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								dcount:=dcount+1;
+								end if;
+							elsif dcount=7 then
+								if interf.I.ramsel='0' then
+								adresse:=core_put_adr+3;
+								SysRam.O.Data_in<=Addr1(Word-1 downto 0);  --source Bas
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								dcount:=dcount+1;
+								end if;
+							elsif dcount=8 then
+								if interf.I.ramsel='0' then
+								adresse:=core_put_adr+4;
+								SysRam.O.Data_in<= Addr2(ADRLEN-1 downto Word) ; -- destination haut
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								dcount:=dcount+1;
+								end if;
+							elsif dcount=9 then
+								if interf.I.ramsel='0' then
+								adresse:=core_put_adr+5;
+								SysRam.O.Data_in<=Addr2(Word-1 downto 0); -- destination bas
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								dcount:=dcount+1;
+								end if;
+							elsif dcount=10 then
+								if interf.I.ramsel='0' then
+								adresse:=core_put_adr+6;
+								SysRam.O.Data_in<=(others=>'0'); -- valeur d'acquittement
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								dcount:=dcount+1;
+								end if;
+							elsif dcount=11 then
+								
+								SysRam.O.we<='1';
+								SysRam.O.ena<='1';
+								SysRam.O.enb<='1';
+								if interf.I.ramsel='0' then
+								adresse:=core_base_adr+1;
+								SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								SysRam.O.Data_in<=x"01"; --instruction pulse enable via la mémoire;
+								Interf.O.Instr_En<='1'; --active la prise en compte de l'instruction
+								Interf.O.membusy<='0';
+								dcount:=dcount+1;
+								end if;
+							elsif dcount=12 then
+								if Interf.I.Instr_ack='1' then -- le Core a reçu l'instruction ?
+									Interf.O.Instr_En<='0';   --désactiver la prise en compte de l'instruction
+									dcount:=dcount+1;
+									config_reg:=SysRam.I.Data_out and x"f6";
+									SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
+								else
+								  Interf.O.Instr_En<='1'; 
+								end if;
+									adresse:=core_base_adr+1;
+									SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
+									SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									--SysRam.O.Ram_busy<='0'; --??
+									SysRam.O.we<='0';
+									SysRam.O.ena<='0';  -- préparer la lecture du résultat du Put
+									SysRam.O.enb<='1';						
+							elsif dcount=13 then
+									adresse:=core_base_adr+1;
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';  -- préparer l'écriture du résultat du Put
+									SysRam.O.enb<='1';
+									if interf.I.ramsel='0' then
+									config_reg:=SysRam.I.Data_out and x"f6";
+									SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
+									dcount:=dcount+1;
+									Interf.O.membusy<='1';
+									end if;
+									SysRam.O.addr_rd<=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+							elsif dcount=14 then
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';  -- préparer l'écriture du résultat du Put
+									SysRam.O.enb<='0';
+									config_reg:=SysRam.I.Data_out and x"f6";
+									SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
+									dcount:=dcount+1;
+									adresse:=core_base_adr+1;
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+							elsif dcount=15 then	
+									SysRam.O.we<='0';
+									SysRam.O.ena<='0';
+									SysRam.O.enb<='1';
+									Interf.O.membusy<='0';
+									if interf.I.ramsel='0' then 
+										SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_put_adr+6,Adrlen));
+										if SysRam.I.Data_out(0)='1' then --fin du MPI PUT ici pour l'envoie !
+											dcount:=dcount+1;
+											SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
+										  Interf.S.Intstate2<=255; --timer pour la réception
+										  interf.s.tmem(0)<=x"02";
+										  report "MPV pMPI_PUT():Ex1 de HCL a répondu concernant l'envoi";
+										end if;
+									end if;
+							elsif dcount=16 or dcount=17 or dcount=18 then
+							  SysRam.O.we<='0';
+									SysRam.O.ena<='0';
+									SysRam.O.enb<='1';
+							  SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
+							   -- ce cycle permet d'attendre la donnée en sortie après le changement d'adresse
+						 
+						   if interf.I.ramsel='0' then 
+							  dcount:=dcount+1; -- ce cycle permet d'attendre la donnée en sortie après le changement d'adresse
+							  
+						    elsif Interf.S.Intstate2>0  then 
+						      dcount:=16;
+										  Interf.S.Intstate2<=Interf.S.Intstate2-1;
+								elsif interf.s.tmem(0)>0 then
+										    interf.s.tmem(0)<=interf.s.tmem(0)-1;
+										    Interf.S.Intstate2<=255;
+										    dcount:=16;
+								else
+										   dcount:=1;--recommencer l'envoi
+ 								end if;
+							elsif dcount=19 then	
+									SysRam.O.we<='0';
+									SysRam.O.ena<='0';
+									SysRam.O.enb<='1';
+									Interf.O.membusy<='0';
+									if interf.I.ramsel='0' then 
+										SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
+										if SysRam.I.Data_out(5)='1' then --Message  du MPI PUT bien reçu !
+											dcount:=dcount+1;
+											report "MPV pMPI_PUT():Ex2 de HCL a reçu un acquittement concernant l'envoi";
+											SysRam.O.addr_rd<=conv_Std_logic_vector(Core_put_adr+7,Adrlen);
+										elsif Interf.S.Intstate2>0  then 
+										  Interf.S.Intstate2<=Interf.S.Intstate2-1;
+										 elsif interf.s.tmem(0)>0 then
+										    interf.s.tmem(0)<=interf.s.tmem(0)-1;
+										    Interf.S.Intstate2<=255;
+										  else
+										   dcount:=1;--recommencer l'envoi
+										   report "MPV pMPI_PUT():Timeout EX2 n'a pas reçu d'acquitement concernant l'envoi. reémission en cours...";
+ 										end if;
+ 									else
+ 									  dcount:=16;
+									end if;
+							elsif dcount=20 then	
+									dcount:=0; --fin normale de la fonction
+									Interf.O.membusy<='0';
+									report "MPV pMPI_PUT():fin normale de la fonction";
+							end if;
+							
+							
+						  NExtCtx:=dcount;
+			--	end if;
+	end procedure;
+
+procedure pMPI_GET(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram;
+ Orig_Addr: std_logic_vector;Orig_Count : natural; Orig_DataType: natural;
+  Target_Rank : natural; Target_disp : std_logic_vector; Target_Count : natural;
+  Target_Datatype :natural; Win : natural) is
+variable i,wcount,dcount : natural range 0 to 255:=0;
+variable adresse :natural;
+variable wdata: std_logic_vector(Word-1 downto 0):=(others=>'0');
+variable bitval : std_logic:='0';
+variable addr1 :std_logic_vector(Orig_Addr'length-1 downto 0):=Orig_Addr;
+variable addr2 :std_logic_vector(Target_Disp'length-1 downto 0):=Target_Disp;
+variable get_adr : std_logic_vector (ADRLEN-1 downto 0);
+variable config_reg,win_reg: std_logic_vector (Word-1 downto 0);
+constant LeftZero: std_logic_vector(2*Word-ADRLEN to 0):=(others=>'0');
+	begin   
+				get_adr:=Std_logic_vector(to_unsigned(Core_get_adr,ADRLEN));
+				
+				addr1:=Orig_Addr;
+				addr2:=Target_Disp;
+				if NextCtx /=0 then --préserver la valeur de count entre les appels
+				dcount:=NextCtx;
+				end if;
+--					
+					
+			--	if rising_edge(clkin) then		
+							
+						if dcount =0 then	
+							dcount:=dcount+1;
+							Interf.S.IntState1<=0;
+						elsif dcount>=1 and dcount <=3 then 
+									if interf.I.ramsel='0' then
+											SysRam.O.we<='1';
+											SysRam.O.ena<='1';
+											SysRam.O.enb<='0';
+											wcount:=Interf.S.IntState1;
+											WritePtr (get_adr,wcount,SysRam);
+											Interf.S.IntState1<=wcount;
+											Interf.O.membusy<='1';
+										  Interf.O.Instruction<=x"00";
+											if wcount =0 then 
+												dcount:=4;
+												Interf.S.Intstate1<=1;
+											end if;	
+										else 
+										  Interf.S.IntState1<=0;
+																	
+									end if;
+							
+							elsif dcount=4 then
+							if interf.I.ramsel='0' then 
+								SysRam.O.we<='1';
+								SysRam.O.ena<='1';
+								SysRam.O.enb<='0';
+								if target_rank <=15 then --limitation de cete version à 16 rang
+								Interf.S.Gstart(Target_rank)<='1';
+								end if;
+								adresse:=core_get_adr;
+								SysRam.O.Data_in<=MPI_GET & conv_Std_logic_vector(Target_Rank,4); --code fonction
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								Interf.O.membusy<='1';
+								dcount:=dcount+1;
+							end if;
+							elsif dcount=5 then 
+								if interf.I.ramsel='0' then	 
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';
+									adresse:=core_get_adr+1;
+									SysRam.O.Data_in<=std_logic_vector(to_unsigned(Orig_Count,8)) ;--la longueur
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								  interf.O.Instruction<=x"06"; --le nbre de mots de l'intstruction
+									dcount:=dcount+1;
+								end if; 
+							elsif dcount=6 then
+								if interf.I.ramsel='0' then 
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';
+									adresse:=core_get_adr+2;
+									SysRam.O.Data_in<= Addr1(ADRLEN-1 downto Word) ; --source Haut
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									
+									dcount:=dcount+1;
+
+								end if;
+							elsif dcount=7 then
+								if interf.I.ramsel='0' then
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';
+									adresse:=core_get_adr+3;
+									SysRam.O.Data_in<=Addr1(Word-1 downto 0);  --source Bas
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									
+									dcount:=dcount+1;
+								end if;
+							elsif dcount=8 then
+								if interf.I.ramsel='0' then 
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';					
+									adresse:=core_get_adr+4;
+									SysRam.O.Data_in<= Addr2(ADRLEN-1 downto Word) ; -- destination haut
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									Interf.O.membusy<='1';
+									dcount:=dcount+1;
+								end if;
+							elsif dcount=9 then
+								if interf.I.ramsel='0' then
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';
+									adresse:=core_get_adr+5;
+									SysRam.O.Data_in<=Addr2(Word-1 downto 0); -- destination bas
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									Interf.O.membusy<='1';
+									dcount:=dcount+1;
+								end if;
+								elsif dcount=10 then
+								if interf.I.ramsel='0' then
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';
+									adresse:=core_get_adr+7;
+									SysRam.O.Data_in<=x"00"; -- résultat du GET
+									SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									Interf.O.membusy<='1';
+									Interf.S.IntState2<=0;
+									dcount:=dcount+1;
+								end if;
+							elsif dcount=11 then
+								 
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';
+									SysRam.O.enb<='1';
+									addr1:=std_logic_vector(to_unsigned(core_base_adr+1,ADRLEN));
+									wcount:=Interf.S.IntState2;
+									wdata:=x"01";bitval:='1';
+									setBit(wcount,Interf,SysRam,addr1(ADrLen-1 downto 0),wdata,bitval);
+									Interf.S.IntState2<=wcount;
+									if wcount=0 then
+									  dcount:=dcount+1;
+									  Interf.O.Instr_En<='1'; --active la prise en compte de l'instruction
+									 end if;
+
+							elsif dcount=12 then
+								if Interf.I.Instr_ack='1' then -- le Core a reçu l'instruction ?
+									Interf.O.Instr_En<='0';   --désactiver la prise en compte de l'instruction
+									dcount:=dcount+1;
+									config_reg:=SysRam.I.Data_out and x"f6";
+									--SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
+								end if;
+									adresse:=core_base_adr+1;
+									SysRam.O.addr_rd<=std_logic_vector(to_unsigned(adresse,ADRLEN));
+									SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									--SysRam.O.Ram_busy<='0'; --??
+									SysRam.O.we<='0';
+									SysRam.O.ena<='0';  -- préparer la lecture du résultat du get
+									SysRam.O.enb<='1';	
+									Interf.O.membusy<='0';
+							elsif dcount=13 then
+								
+									adresse:=core_base_adr+1;
+									SysRam.O.we<='1';
+									SysRam.O.ena<='1';  -- préparer l'écriture du résultat du get
+									SysRam.O.enb<='1';
+									SysRam.O.addr_rd<=std_logic_vector(to_unsigned(adresse,ADRLEN));
+									SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+
+								if interf.I.ramsel='0' then 	
+									config_reg:=SysRam.I.Data_out and x"f6";
+									SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
+									dcount:=dcount+1;
+									Interf.O.membusy<='1';
+								end if;
+										Interf.s.IntState2<=255;
+										Interf.s.tmem(0)<=x"08"; --tempo pour l'attente du résultat de Get							
+							elsif dcount=14 then
+									 
+										SysRam.O.we<='1';
+										SysRam.O.ena<='1';  -- préparer l'écriture du résultat du GET
+										SysRam.O.enb<='0';
+										adresse:=core_base_adr+1;
+										SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									if interf.I.ramsel='0' then
+										config_reg:=SysRam.I.Data_out and x"f6";
+										SysRam.O.Data_in<=config_reg ; --ramener le IPulse à 0;
+										dcount:=18;--dcount+1;
+										Interf.O.membusy<='1';
+						
+									end if;
+							elsif dcount=15 then
+									 
+										SysRam.O.we<='0';
+										SysRam.O.ena<='0';  -- préparer l'écriture du WBusy
+										SysRam.O.enb<='1';
+										adresse:=core_base_adr+5;
+										SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+										SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+
+									if interf.I.ramsel='0' then
+										config_reg:=SysRam.I.Data_out or x"40"; --mettre à 1 Wbusy
+										SysRam.O.Data_in<=config_reg ; --mettre à 1 Wbusy
+										dcount:=dcount+1;
+										Interf.O.membusy<='1';
+									end if;
+							elsif dcount=16 then
+									 
+										SysRam.O.we<='0';
+										SysRam.O.ena<='0';  -- préparer l'écriture du WBusy
+										SysRam.O.enb<='1';
+										adresse:=core_base_adr+5;
+										SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									if interf.I.ramsel='0' then
+										config_reg:=SysRam.I.Data_out or x"40"; --mettre à 1 Wbusy
+										SysRam.O.Data_in<=config_reg ; --mettre à 1 Wbusy
+										dcount:=dcount+1;
+										Interf.O.membusy<='1';
+								
+									end if;
+							elsif dcount=17 then
+									 
+										SysRam.O.we<='1';
+										SysRam.O.ena<='1';  -- préparer l'écriture du résultat du GET
+										SysRam.O.enb<='1';
+										adresse:=core_base_adr+5;
+										SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+									if interf.I.ramsel='0' then
+										config_reg:=SysRam.I.Data_out or x"40";
+										SysRam.O.Data_in<=config_reg ; --;
+										dcount:=dcount+1;
+										Interf.O.membusy<='1';
+									end if;
+							elsif dcount>=18 and dcount <=21 then	
+									SysRam.O.we<='0';
+									SysRam.O.ena<='0';
+									SysRam.O.enb<='1';
+									Interf.O.membusy<='0';
+									if interf.I.ramsel='0' then 
+										SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_get_adr+6,Adrlen));
+										if SysRam.I.Data_out(0)='1' then --fin du MPI get ici pour l'envoie !
+											dcount:=dcount+1;
+										end if;
+									end if;
+	         elsif dcount>=22 and dcount <=24 then	
+									SysRam.O.we<='0';
+									SysRam.O.ena<='0';
+									SysRam.O.enb<='1';
+									Interf.O.membusy<='0';
+									SysRam.O.addr_rd<=conv_Std_logic_vector(Core_Get_adr+7,Adrlen);
+									if interf.I.ramsel='0' then 
+										SysRam.O.addr_rd<=conv_Std_logic_vector(Core_Get_adr+7,Adrlen);
+										if SysRam.I.Data_out(5)='1' then --Message  du MPI Get bien reçu !
+											dcount:=dcount+1; --ce test est fait avant l'arrivée effective des données ce qui pose problème !
+											SysRam.O.addr_rd<=conv_Std_logic_vector(Core_Get_adr+7,Adrlen);
+										elsif Interf.S.Intstate2>0 then 
+										  Interf.S.Intstate2<=Interf.S.Intstate2-1;
+										 elsif interf.s.tmem(0)>0 then
+                          interf.s.tmem(0)<=interf.s.tmem(0)-1;
+                          Interf.S.Intstate2<=255;
+										  else
+										   dcount:=1;--recommencer l'envoi
+ 										end if;
+									end if;
+							
+							elsif dcount=25 then	
+									dcount:=0; --fin normale de la fonction
+									Interf.O.membusy<='0';
+									SysRam.O.we<='0';
+									SysRam.O.ena<='0';
+									SysRam.O.enb<='0';
+							end if;
+
+						  NExtCtx:=dcount;
+--			end if; 
+	end procedure; 
+Procedure 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 
+Begin
+--cette procédure permet de récupérer le groupe qui est associé à un communicateur
+--dans notre cas c'est la récupération du groupe associé à COMM_WORLD
+end procedure;
+--int MPI_Group_incl(MPI_Group group, int n, int *ranks,
+--    MPI_Group *newgroup)
+Procedure pMPI_group_incl(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam : inout typ_dpram;
+									GRP: Mpi_group; n:natural;ranks :natural; newgroup: out Mpi_group) is
+Begin
+-- cette procedure a pour algo de parcourir les rangs qui sont dans la mémoire pointée par ranks
+-- et d'activer l'un des  bits de position de newgroup. 
+-- 
+--
+end procedure;
+								
+procedure 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
+variable adresse_rd : natural range 0 to 2**ADRLEN-1;	
+
+begin
+
+		if NextCtx =0 then
+			SysRam.O.we<='0';
+			SysRam.O.ena<='0';
+			SysRam.O.enb<='1';
+			adresse_rd:=CORE_INIT_ADR+1;
+			SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
+			
+				NextCtx:=1;
+		
+		elsif NextCtx=1 then
+			SysRam.O.we<='0';
+			SysRam.O.ena<='0';
+			SysRam.O.enb<='1';
+			adresse_rd:=CORE_INIT_ADR+1;
+			SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
+			if interf.I.ramsel='0' then
+				Rank<=SysRam.I.Data_out(3 downto 0);
+				NextCtx:=2;
+				Interf.O.membusy<='1';
+			end if;	
+		elsif NextCtx=2 then
+			SysRam.O.we<='0';
+			SysRam.O.ena<='0';
+			SysRam.O.enb<='1';
+			adresse_rd:=CORE_INIT_ADR+1;
+			SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
+			if interf.I.ramsel='0' then
+				Rank<=SysRam.I.Data_out(3 downto 0);
+				Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
+				NextCtx:=3;
+				Interf.O.membusy<='1';
+			end if;	
+		elsif NextCtx=3 then
+			SysRam.O.we<='0';
+			SysRam.O.ena<='0';
+			SysRam.O.enb<='1';
+			adresse_rd:=CORE_INIT_ADR+1;
+			SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
+			if interf.I.ramsel='0' then
+				Rank<=SysRam.I.Data_out(3 downto 0);
+				Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
+				NextCtx:=4;
+				Interf.O.membusy<='1';
+			end if;	
+		elsif NextCtx=4 then
+			SysRam.O.we<='0';
+			SysRam.O.ena<='0';
+			SysRam.O.enb<='1';
+			adresse_rd:=CORE_INIT_ADR+1;
+			SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(adresse_rd,ADRLEN));
+			if interf.I.ramsel='0' then
+				Rank<=SysRam.I.Data_out(3 downto 0);
+				Interf.S.Rank<=conv_integer(SysRam.I.Data_out(3 downto 0));
+				NextCtx:=0;
+				Interf.O.membusy<='0';
+			end if;	
+		end if;
+end procedure;
+
+--int MPI_Win_create(
+--  void *base,
+--  MPI_Aint size,
+--  int disp_unit,
+--  MPI_Info info,
+--  MPI_Comm comm,
+--  MPI_Win *win
+--);
+procedure pMPI_Win_create(NextCtx : inout natural ;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+									base :std_logic_vector; size : Mpi_Aint;disp_unit:natural; 
+									info:natural; comm:Mpi_Comm; Win: inout MPI_Win ) is
+ -- parcours de la liste des fenêtres existantes à la recherche d'un emplacement libre
+ -- si fenêtre libre trouvée, et 
+ -- mise à 1 du Bit WCreate du registre status
+ type wtype is array (1 to 4 ) of natural range 0 to 255;
+ variable AdrWin: std_logic_vector(ADRLEN-1 downto 0);
+ variable adresse : std_logic_vector(ADRLEN-1 downto 0);
+ variable clkin : std_logic:='1';
+ variable wcreate_adr : std_logic_vector(ADRLEN-1 downto 0):=std_logic_vector(to_unsigned(Core_wcreate_adr,ADRLEN));
+ variable w0 : std_logic_vector(Word-1 downto 0);
+ variable adrnat : natural;
+ variable sizewin : std_logic_vector(Word-1 downto 0);
+ variable count : natural range 0 to 255;
+ variable wdisp  :wtype:=(4,14,24,34); --stocke l'adresse de la prochaine Win libre
+begin
+-- création d'une fenêtre il s'agit d'affecter l'objet Win et de retourner 
+-- le pointeur qui permet de le décrire 
+
+
+If NextCtx=0 then 
+	NExtCtx:=NextCtx+1;
+	count:=0;
+	Interf.O.membusy<='0';
+	Interf.S.IntState1<=count;
+elsif NextCtx>=1 and NextCtx <= 4 then
+	count:=Interf.S.IntState1;
+	AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(NextCtx),16));
+	 readmem(count,interf,sysRam,AdrWin,w0);
+		if count=0 then
+			if w0(0)/='1' then -- cette fenêtre est libre
+				NextCtx:=6; --étape de la création de la fenêtre
+				Win.addr:=base; --l'adresse de la fenêtre
+				Win.id:=NextCtx; -- la référence provisoire de la fenêtre
+				Win.size:=Size; -- la taille de la fenêtre
+				
+			else
+				NextCtx:=NextCtx+1;
+			end if;
+		end if;
+		Interf.S.IntState1<=count;--sauvegarde du statut de la sous-procédure
+		
+elsif NextCtx=5 then
+	-- Plus de fenêtre disponible erreur
+		NextCtx:=1; -- boucle sans fin :)
+		Win.id:=0;
+		Win.addr:=x"0000";
+elsif NextCtx=6 then
+		--Affectation de l'objet Windows car une place est disponible
+		count:=Interf.S.IntState1;
+		AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
+		Writemem(count,interf,SysRam,AdrWin,x"01"); --signal status pour created
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+		
+elsif NextCtx=8 then
+		AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
+		interf.S.winid<=interf.S.winid+1;
+		count:=Interf.S.IntState1;
+		Writemem(count,interf,SysRam,AdrWin+1,stdlv(interf.S.winid,8)); --win id de la fenêtre
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+elsif NextCtx=9 then
+
+		adrnat:=Core_base_adr+Wdisp(Win.id);
+		
+		AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
+		count:=Interf.S.IntState1;
+		
+		
+		Writemem(count,interf,SysRam,AdrWin+2,base(7 downto 0)); --adresse basse
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+elsif NextCtx=10 then
+		AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
+		count:=Interf.S.IntState1;
+		Writemem(count,interf,SysRam,AdrWin+3,base(15 downto 8)); --adresse haute
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+elsif NextCtx=11 then
+		AdrWin:=std_logic_vector(to_unsigned(Core_base_adr+Wdisp(Win.id),16));
+		sizewin:=std_logic_vector(to_unsigned(size,8));
+		count:=Interf.S.IntState1;
+		Writemem(count,interf,SysRam,AdrWin+4,sizewin); -- taille de la fenêtre
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+elsif NextCtx=12 then	
+	--cette étape consiste à envoyer le message WINCREATE Sur le réseau et à récupérer
+	-- les informations donnant le numéro de la fenêtre
+		W0:=MPI_WIN_CREATE & std_logic_vector(to_unsigned(0,4)); --code fonction
+		count:=Interf.S.IntState1;
+		Writemem(count,interf,SysRam,wcreate_adr,w0);
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+		
+	elsif NextCtx=13 then 
+		w0:=std_logic_vector(to_unsigned(Win.Id,8));							-- id proposé pour la fenêtre en création
+		count:=Interf.S.IntState1;
+		Writemem(count,interf,SysRam,wcreate_adr+1,w0);
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+	elsif NextCtx=14 then
+		SysRam.O.we<='1';
+		SysRam.O.ena<='1';
+		SysRam.O.enb<='0';
+		count:=Interf.S.IntState1;
+		if interf.I.ramsel='0' then
+			WritePtr (wcreate_adr,count,SysRam); --écriture du pointeur d'instruction
+			Interf.S.IntState1<=count;
+			if count=0 then
+				NextCtx:=NextCtx+1;
+			end if;
+		end if;
+	elsif NextCtx=15 then
+									-- il faut mettre instruction_en à 1
+				SysRam.O.we<='0';
+				SysRam.O.ena<='0';
+				SysRam.O.enb<='1';
+				SysRam.O.we<='1';
+				SysRam.O.ena<='1';
+				SysRam.O.enb<='1';
+				adresse:=stdlv(core_base_adr+1);
+								SysRam.O.addr_rd<=adresse;
+								SysRam.O.Addr_wr<=adresse;
+								SysRam.O.Data_in<=x"01"; --instruction pulse enable via la mémoire;
+		Writemem(count,interf,SysRam,adresse,x"01");
+		Interf.S.IntState1<=count;
+		if count=0 then
+			NextCtx:=NextCtx+1;
+		end if;
+				Interf.O.Instr_En<='1';
+				adresse:=stdlv(core_base_adr);
+				SysRam.O.Addr_rd<=adresse;
+				NextCtx:=NextCtx+1;
+	elsif NextCtx=16 then --acquittement de la copie des données dans le tampon de la lib
+				if Interf.I.Instr_ack='1' then
+					Interf.O.Instr_En<='0';
+					NextCtx:=NextCtx+1;
+				end if;
+				SysRam.O.we<='0';
+				SysRam.O.ena<='0';
+				SysRam.O.enb<='1';
+	elsif NextCtx=17 then
+			-- lecture du résultat de l'instruction
+			
+	
+else
+	
+end if;
+end procedure;
+--int MPI_Win_start(
+--  MPI_Group group,
+--  int assert,
+--  MPI_Win win
+--);
+procedure 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
+--cette fonction active les bits WStart pour chaque processus avec lequel 
+-- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
+--chacune de ces cibles
+ variable dcount : natural range 0 to 255:=0;
+ variable cstatus : std_logic_vector(Word-1 downto 0);
+ begin
+
+ -- retour de l'adresse de de la fenêtre dans la structure Win
+ -- initialisation des bits concernant 
+ 
+ if NextCtx =0 then 
+			NextCtx:=NextCtx+1;
+		elsif NextCtx=1 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
+					SysRam.O.Data_in<=x"01"; --mise à 1 du bit WSTART et remise à zero de tous les autres Bits	
+							
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';		
+					Interf.S.GStart<=(others=>'0');				
+			end if;
+	elsif NextCtx=2 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
+					SysRam.O.Data_in<=x"01";
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+		elsif NextCtx=3 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
+					SysRam.O.Data_in<=x"01";
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+	elsif NextCtx=4 then
+		NextCtx:=0;
+		Interf.O.membusy<='0';
+		SysRam.O.we<='0';
+		SysRam.O.ena<='0';
+	end if;
+
+ 
+ end procedure;
+procedure pMPI_Win_complete( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
+variable adresse :natural;
+variable wcount: natural range 0 to 255:=0;
+variable LRam : typ_dpRam;
+variable SyncDest,i : natural range 0 to 15; --destination du message de synchronisation
+variable W0 :std_logic_vector(Word-1 downto 0);
+variable wcompl_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
+
+begin
+  --
+  				wcompl_adr:=Std_logic_vector(to_unsigned(Core_wcompl_adr,ADRLEN));
+				LRam:=SysRam; -- nécessaire pour le débogage
+				if NextCtx =0 then
+					
+					SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='0';
+					Interf.O.MemBusy<='1'; --occuper la mémoire
+					Interf.S.IntState1<=0;
+					NextCtx:=1;
+					adresse:=core_wcompl_adr;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.O.Instr_En<='0';
+					Interf.O.Instruction<=x"00";				
+				elsif NextCtx=1 then --écriture du ptr d'intruction
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					if interf.I.ramsel='0' then
+					
+					adresse:=core_wcompl_adr;
+				
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.O.Instr_En<='0';
+					Interf.O.membusy<='1';
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+				  wcount:=Interf.S.IntState1;
+          WritePtr (wcompl_adr,wcount,SysRam); --attn cette fonction ne met pas à jour (we et ena) ! a voir
+          Interf.S.IntState1<=wcount;
+          
+            if wcount =0 then 
+                  NextCtx:=2;
+                  Interf.S.IntState1<=0;
+                  Interf.S.IntState2<=0;
+                  Interf.S.tmem(0)<=Interf.S.GStart(7 downto 0); --cibles impactées
+                  Interf.S.tmem(1)<=Interf.S.GStart(15 downto 8); --cibles impactées
+                  adresse:=core_wcompl_adr;
+                  SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+            end if;	
+      else
+        Interf.S.IntState1<=0; --recommencer l'écriture du pointeur	
+         end if;       
+				elsif NextCtx=2 then 
+					if 	Interf.I.Ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';
+				  adresse:=core_wcompl_adr;
+				  NextCtx:=10; --aller à la fin de la fonction
+				  i:=0;
+				  l1:for i in 0 to 7 loop
+				  --  i:=i+1;
+				  if i>=interf.s.intState2 then 				  
+				  if interf.s.gstart(i)='1' then
+					SysRam.O.Data_in<=MPI_WIN_SYNC & std_logic_vector(to_unsigned(i,4));
+					Interf.S.tmem(2)<=MPI_WIN_SYNC & std_logic_vector(to_unsigned(i,4));
+
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.S.tmem(0)(i)<='0'; --ce dest a été traité !
+					NextCtx:=4;
+					Interf.S.IntState2<=i+1;
+					exit l1;
+					end if;
+					end if;
+					exit l1 when i=7;
+					end loop l1;
+					end if;
+				elsif NextCtx=3 then 
+					if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';	
+				  adresse:=core_wcompl_adr;
+				  wcount:=Interf.S.IntState1;
+          WritePtr (wcompl_adr,wcount,SysRam); --attn cette fonction ne met pas à jour (we et ena) ! a voir
+          Interf.S.IntState1<=wcount;
+					SysRam.O.Data_in<= Interf.S.tmem(2);
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					if wcount=0 then 
+					 NextCtx:=NextCtx+1;
+					 end if;
+					end if;
+				elsif NextCtx=4 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';	
+				  adresse:=core_wcompl_adr+1;
+					SysRam.O.Data_in<= x"04" ;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=NextCtx+1;
+				elsif NextCtx=5 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';
+					adresse:=core_wcompl_adr+2;
+				  Interf.O.Instruction<=x"04";--longueur de l'instruction
+					SysRam.O.Data_in<=x"00" ;--
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=6;
+				elsif NextCtx=6 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';
+				  adresse:=core_wcompl_adr+3;
+					SysRam.O.Data_in<= SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=7;
+				elsif NextCtx=7 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+				  adresse:=core_wcompl_adr+3;
+					SysRam.O.Data_in<=SYNC_WCOMP & std_logic_vector(to_unsigned(Interf.S.Rank,4));
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=NextCtx+1;
+
+				elsif NextCtx=8 then --fin de la fonction
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							--dcount:=0;
+							Interf.O.membusy<='0';
+							Interf.O.Instr_En<='1';
+							SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr+5,AdrLen));
+							NextCtx:=NextCtx+1;
+				elsif NextCtx=9 then --acquittement de la copie des données dans le tampon
+							if Interf.I.Instr_ack='1' then
+								Interf.O.Instr_En<='0';
+								NextCtx:=10;
+							end if;
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							
+				elsif NextCtx=10 then --lecture de la fin de WComplete
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							Interf.O.membusy<='0';
+							if interf.S.IntState2=0 then --aucune instruction MPI exécutée ?
+							  NextCtx:=12;
+							elsif Interf.S.tmem(0)/=0 then --plus de message compl à envoyer
+							   NextCtx:=2;
+							 elsif Interf.S.tmem(0)=0 then
+							   if interf.I.ramsel='0' then
+							       NextCtx:=NextCtx+1;
+          							   SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
+							   end if;
+							 end if; 
+				elsif NextCtx=11 then --test de la fin des transferts
+					if interf.I.ramsel='0' then
+        					SysRam.O.we<='0';
+        					SysRam.O.ena<='0';
+        					SysRam.O.enb<='1';
+        					SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+5,Adrlen));
+        							if SysRam.I.Data_out(0)='1' and  SysRam.I.Data_out(6)='0' then --si WStart=1 et Wbusy=0
+        							  --il faut un DSent=1 pour Put ou un DSending pour Get
+										if SysRam.I.Data_out(5)='1' or  (SysRam.I.Data_out(4)='1' and SysRam.I.Data_out(1)='1')  then 
+												NextCtx:=NextCtx+1;
+										end if;	
+									end if;									
+				
+					end if;	
+				elsif NextCtx=12 then
+									Interf.S.IntState1<=0; -- initialisation du compteur d'état
+								Interf.S.IntState2<=0;
+									SysRam.O.enb<='0';
+								NextCtx:=0; --fin de la fonction			
+      end if;
+
+end procedure;
+procedure 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
+--cette fonction active les bits WStart pour chaque processus avec lequel 
+-- la source veut communiquer et par la suite envoie un message de synchro sur le réseau à
+--chacune de ces cibles
+ variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire 
+ variable dcount : natural range 0 to 255:=0;
+ variable cstatus : std_logic_vector(Word-1 downto 0);
+ begin
+
+ -- retour de l'adresse de de la fenêtre dans la structure Win
+ -- initialisation des bits concernant 
+ if Win.id =0 then
+   W_ptr:=Core_Base_Adr+4;
+ end if;
+ if NextCtx =0 then 
+			
+			if pgroup.grp=0 then --rien à faire
+			  nextCtx:=5;
+			  Interf.S.GPost<=(others=>'0');
+			 else
+			   NextCtx:=NextCtx+1;
+			end if;
+		  Interf.O.Instruction<=x"00";
+		elsif NextCtx=1 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+					SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits	
+							
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';		
+									
+			end if;
+			 --limitation de cete version à 16 rang
+				Interf.S.GPost<=pgroup.grp;
+	elsif NextCtx=2 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+					SysRam.O.Data_in<=x"48"; --mise à 1 du bit WPOST et WBusy et remise à zero de tous les autres Bits	
+							
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';		
+									
+			end if;						
+	elsif NextCtx=3 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_Ptr+W_Gpost,Adrlen));
+					SysRam.O.Data_in<=pgroup.grp(7 downto 0);
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+elsif NextCtx=4 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
+					SysRam.O.Data_in<=pgroup.grp(15 downto 8);
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+elsif NextCtx=6 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					SysRam.O.addr_wr<=Std_logic_vector(to_unsigned(W_ptr+W_Gpost+1,Adrlen));
+					SysRam.O.Data_in<=pgroup.grp(15 downto 8);
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';	
+			end if;
+	elsif NextCtx=5 then
+	         SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='0';
+		NextCtx:=0;
+		Interf.O.membusy<='0';
+	end if;
+
+ 
+ end procedure;
+ 
+ procedure pMPI_Win_wait( NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram; Win :MPI_Win) is
+--permet de synchroniser la fin des opérations sur une fenêtre
+variable dcount : natural range 0 to 255:=0;
+variable cstatus : std_logic_vector(Word-1 downto 0);
+variable W_Ptr : natural range 0 to 65535:=0;--adresse de la fenêtre en mémoire
+begin
+	W_Ptr:=Core_base_adr+4;--adresse du reg status de la première fenêtre
+		if NextCtx =0 then 
+			NextCtx:=NextCtx+1;
+		elsif NextCtx=1 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='1';
+					NextCtx:=NextCtx+1;
+			end if;
+			     SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(core_base_adr+4,Adrlen));
+            If Interf.S.Gpost=0 then
+             NextCtx:=5; --rien à synchroniser
+          end if;
+  elsif (NextCtx>=2) and (NextCtx <=3) then
+    SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+    if interf.I.ramsel='0' then
+					SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='1';
+					NextCtx:=NextCtx+1;
+		else
+		    NextCtx:=1;
+		   end if;
+		elsif NextCtx=4 then
+			if interf.I.ramsel='0' then
+					SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='1';
+					SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(W_ptr+W_status,Adrlen));
+						
+							if SysRam.I.Data_out(3)='1' and SysRam.I.Data_out(6)='0' then --si WPost=1 et WBusy=0
+							  --il faut un DSent=1 pour Put ou un DSending pour Get
+  							   if SysRam.I.Data_out(4)='1' or  (SysRam.I.Data_out(5)='1' and SysRam.I.Data_out(2)='1')  then 
+  									   NextCtx:=NextCtx+1;
+  									   Interf.S.GPost<=(others=>'0');
+  							   end if;	
+							elsif SysRam.I.Data_out(3)='0' then 
+              							  NextCtx:=NextCtx; --pas d'opérations en attente
+							else
+							  NextCtx:=NextCtx; --on attend
+							end if;	
+			else
+			 NextCtx:=2;		--retour à l'atente du Bit !
+			end if;	
+	
+	elsif NextCtx=5 then
+		      SysRam.O.we<='0';
+					SysRam.O.ena<='0';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='0';
+		      NextCtx:=0;
+	end if;
+
+
+end procedure;
+
+
+ Procedure pMPI_Finalize(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram) is
+  begin
+ 
+ end procedure;
+ 
+ procedure pMPI_Comm_Spawn(NextCtx : inout natural;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;  
+command : natural;  argv :natural; maxprocs : natural;  info : natural; root : natural;   comm : natural;  
+signal intercomm :out natural; signal  array_of_errcodes : out natural) is
+
+variable i,dcount : natural:=0;	
+variable adresse :natural;
+variable spawn_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_spawn_adr,ADRLEN));
+begin
+ spawn_adr:=Std_logic_vector(to_unsigned(Core_spawn_adr,ADRLEN));
+				if NextCtx =0 then
+					
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+				  Interf.O.Instruction<=x"00";					
+					NextCtx:=1;
+				elsif NextCtx=1 then 
+					if interf.I.ramsel='0' then
+					NextCtx:=2;
+					adresse:=core_spawn_adr;
+					SysRam.O.Data_in<=MPI_SPAWN & x"0" ;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.O.membusy<='1';
+					Interf.O.Instr_En<='0';
+					Interf.S.IntState2<=1; -- préparation de la destination du spawn
+					end if;
+				elsif NextCtx=2 then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					if interf.I.ramsel='0' then
+					NextCtx:=NextCtx+1;
+					Interf.O.membusy<='1';
+					adresse:=core_spawn_adr;
+					if interf.I.ismain='1' then ---déclanche l'éxécution de la commande
+						SysRam.O.Data_in<=MPI_spawn & x"0";--Std_logic_vector(to_unsigned(Interf.S.IntState2+2,4)) ;
+						SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+						
+					else -- envoie d'une commande spawn à la main lib
+						SysRam.O.Data_in<=MPI_spawn & x"0" ;
+						SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+						Interf.O.Instr_En<='0';
+						Interf.O.membusy<='1';
+						
+						end if;
+					end if;
+				
+				elsif NextCtx=3 then 
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					adresse:=core_spawn_adr;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=NextCtx+1;
+				elsif NextCtx=4 then	
+					if interf.I.ramsel='0' then
+								adresse:=core_spawn_adr+1;
+								SysRam.O.Data_in<=std_logic_vector(to_unsigned(4,8)) ;--la longueur
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								Interf.O.Instruction<=x"04";
+								NextCtx:=NextCtx+1;
+					end if;
+				elsif NextCtx=5 then
+					if interf.I.ramsel='0' then
+								adresse:=core_spawn_adr+2;
+								SysRam.O.Data_in<=std_logic_vector(to_unsigned(maxprocs,8)) ;--le nombre de processus
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								NextCtx:=NextCtx+1;
+					end if;
+				elsif NextCtx=6 then
+					if interf.I.ramsel='0' then
+								adresse:=core_spawn_adr+3;
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								SysRam.O.Data_in<=SPAWN_LOAD & std_logic_vector(to_unsigned(maxprocs,4)) ;--l'instruction
+								NextCtx:=NextCtx+1;
+
+					end if;
+				elsif NextCtx=7 then
+					if interf.I.ramsel='0' then
+								adresse:=core_spawn_adr+3;
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								SysRam.O.Data_in<=SPAWN_LOAD & std_logic_vector(to_unsigned(maxprocs,4)) ;--l'instruction
+								NextCtx:=NextCtx+1;
+                report "MPV SPAWN activé " & integer'image(interf.I.Rank);
+					end if;
+					elsif NextCtx=8 then
+					if interf.I.ramsel='0' then
+								adresse:=core_spawn_adr+7;
+								SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+								SysRam.O.Data_in<=std_logic_vector(to_unsigned(0,Word)) ;--l'acquittement en retour
+								NextCtx:=NextCtx+1;
+               -- report "MPV SPAWN activé " & integer'image(interf.I.Rank);
+					end if;
+				elsif NextCtx=9 then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					dcount:=Interf.S.IntState1;
+					if interf.I.ramsel='0' then
+						SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,ADRLEN));
+						WritePtr (spawn_adr,dcount,SysRam);
+						Interf.O.Instr_En<='0';
+						Interf.O.membusy<='1';
+						Interf.S.IntState1<=dcount;
+						if dcount =0 then 
+								NextCtx:=NextCtx+1;
+						end if;
+					end if;
+				elsif NextCtx=10 then
+			
+				 --fin de la fonction
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							dcount:=0;
+							Interf.O.membusy<='0';
+							Interf.O.Instr_En<='1';
+							SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,AdrLen));
+							NextCtx:=NextCtx+1;
+				elsif NextCtx=11 then --acquittement de la copie des données dans le tampon
+							if Interf.I.Instr_ack='1' then
+								Interf.O.Instr_En<='0';
+								NextCtx:=NextCtx+1;
+							end if;
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+				elsif NextCtx=12 then --lecture de la fin de l'initialisation
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							adresse:=core_spawn_adr+7; 
+							SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
+							if interf.I.ramsel='0' then 	
+									NextCtx:=NextCtx+1;
+							end if;
+			
+				elsif NextCtx=13 then --lecture de la fin de l'initialisation
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							adresse:=core_spawn_adr+7;
+							if interf.I.ramsel='0' then 
+								SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
+								if SysRam.I.Data_out(5)='1' then  --spawned
+									NextCtx:=NextCtx+1;
+									intercomm<=1;
+								end if;
+								Interf.O.membusy<='0';
+						  else
+						    NextCtx:=12;
+							end if;	
+				elsif NextCtx=14 then --lecture de la fin de l'initialisation
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							adresse:=core_spawn_adr+8;
+							if interf.I.ramsel='0' then 
+								SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
+								Intercomm<=conv_integer(SysRam.I.Data_out);-- le groupe des Ht Fils
+								NextCtx:=NextCtx+1;
+									
+							end if;
+								Interf.O.membusy<='0';
+								
+				elsif NextCtx=15 then --lecture de la fin de l'initialisation
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							adresse:=core_spawn_adr+8;
+							if interf.I.ramsel='0' then 
+								SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(adresse,Adrlen));
+								Intercomm<=conv_integer(SysRam.I.Data_out);-- le groupe des Ht Fils									
+								NextCtx:=NextCtx+1;
+								
+								end if;
+								Interf.O.membusy<='0';
+															
+				elsif NextCtx =16 then
+							Interf.O.Instr_En<='0';
+							Interf.O.membusy<='0';
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='0';
+							NextCtx:=0;
+							--array_of_errcodes<=0;
+				end if;
+				array_of_errcodes<=NextCtx;
+ end procedure;
+ 
+procedure pMPI_INIT(NextCtx : inout natural;signal Interf:inout Core_io;signal clkin:std_logic;signal SysRam :inout typ_dpram) is
+variable i,dcount,wcount : natural range 0 to 255:=0;	
+variable adresse :natural;
+variable LRam : typ_dpRam;
+variable W0 :std_logic_vector(Word-1 downto 0);
+variable init_adr : std_logic_vector(adrlen-1 downto 0):=Std_logic_vector(to_unsigned(Core_init_adr,ADRLEN));
+begin
+				init_adr:=Std_logic_vector(to_unsigned(Core_init_adr,ADRLEN));
+				LRam:=SysRam; -- nécessaire pour le débogage
+				adresse:=0;
+				if NextCtx =0 then
+					
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.S.IntState1<=0;
+					Interf.O.Instruction<=x"00";
+					NextCtx:=1;
+					adresse:=core_init_adr;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.O.Instr_En<='0';
+					
+				elsif NextCtx=1 then --écriture du ptr d'intruction
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					if interf.I.ramsel='0' then
+					
+					adresse:=core_init_adr;
+				
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					Interf.O.Instr_En<='0';
+					Interf.O.membusy<='1';
+					
+				  wcount:=Interf.S.IntState1;
+          WritePtr (Init_adr,wcount,SysRam);
+          Interf.S.IntState1<=wcount;
+          
+            if wcount =0 then 
+                  NextCtx:=2;
+                  Interf.S.IntState1<=0;
+                  adresse:=core_init_adr;
+                  SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+            end if;		
+         end if;       
+				elsif NextCtx=2 then 
+				  if interf.I.ramsel='0' then
+					   SysRam.O.we<='1';
+					   SysRam.O.ena<='1';
+					   SysRam.O.enb<='0';
+				      adresse:=core_init_adr;
+					   SysRam.O.Data_in<=MPI_INIT & x"0" ;
+					   SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					   NextCtx:=3;
+					   Interf.O.membusy<='1';
+					end if;
+				elsif NextCtx=3 then 
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';
+				  adresse:=core_init_adr+1;
+					SysRam.O.Data_in<= x"04" ;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=NextCtx+1;
+					end if;
+				elsif NextCtx=4 then 
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					Interf.O.membusy<='1';
+					SysRam.O.enb<='0';
+					adresse:=core_init_adr+1;
+				  Interf.O.Instruction<=x"04";
+					SysRam.O.Data_in<=x"04" ;--longueur de l'instruction
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=5;
+					end if;
+				elsif NextCtx=5 then 
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					Interf.O.membusy<='1';
+					SysRam.O.enb<='0';
+				  adresse:=core_init_adr+2;
+					SysRam.O.Data_in<= x"00" ;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=6;
+					end if;
+				
+				elsif NextCtx=6 then 
+				  if Interf.I.ramSel='0' then
+					SysRam.O.we<='1';
+					SysRam.O.ena<='1';
+					SysRam.O.enb<='0';
+					Interf.O.membusy<='1';
+				  adresse:=core_init_adr+3;
+					SysRam.O.Data_in<=x"00" ;
+					SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+					NextCtx:=7;
+				end if;
+				elsif NextCtx=7 then --fin de la fonction
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							Interf.O.membusy<='0';
+							dcount:=0;
+							Interf.O.membusy<='0';
+							Interf.O.Instruction(6)<=Interf.I.Spawned; --- préciser que la HT est dynamique
+							Interf.O.Instr_En<='1';
+							SysRam.O.Addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,AdrLen));
+							NextCtx:=8;
+				elsif NextCtx=8 then --acquittement de la copie des données dans le tampon
+							if Interf.I.Instr_ack='1' then
+								Interf.O.Instr_En<='0';
+								NextCtx:=9;
+							end if;
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+							
+				elsif NextCtx=9 then --lecture de la fin de l'initialisation
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+						
+							if interf.I.ramsel='0' then 
+								SysRam.O.addr_rd<=Std_logic_vector(to_unsigned(Core_base_adr,Adrlen));
+								if SysRam.I.Data_out(4)='1' then 
+									NextCtx:=10;
+									Interf.S.IntState1<=0; -- initialisation du compteur d'état
+								end if;
+								Interf.O.membusy<='0';
+							end if;								
+				elsif NextCtx =10 then
+							dcount:=Interf.S.IntState1; --permet de sauvegarder l'état interne du compteur
+							readmem(dcount,interf,sysRam,init_Adr,w0);
+							Interf.S.IntState1<=dcount;
+							w0:=SysRam.I.Data_out;
+							if dcount=0 then
+								Interf.I.ismain<=all_zeros(SysRam.I.Data_out(3 downto 0));--Rank=0 -> MainLib
+								NextCtx:=NextCtx+1;
+							else
+							Interf.I.ismain<='0';
+							end if;								
+				elsif NextCtx =11 then
+        				  Interf.O.Instruction<=x"00";	
+							Interf.O.Instr_En<='0';
+							Interf.O.membusy<='0';
+							SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='0';
+							NextCtx:=0;
+				end if;
+							
+				
+end procedure;
+
+
+procedure WriteMem(NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+						AdrVect:in std_logic_vector; Data:in std_logic_vector) is
+--cette procédure permet d'écrire un mot dans la mémoire du PE(tâche matérielle)
+--en ayant vérifié que le bus est bien disponible pour l'écriture
+ variable i,dcount : natural:=0;	
+variable adresse :natural;
+variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
+
+begin
+				if NextCtx /=0 then --préserver la valeur de count entre les appels
+					dcount:=NextCtx;
+				else
+					
+					
+				end if;
+				
+							
+				if dcount=0 then
+					--if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+						--Interf.O.membusy<='1';
+					--end if;
+						SysRam.O.Data_in<=AdrToSet(Word-1 downto 0);					
+						SysRam.O.Addr_wr<=adrToSet;
+				elsif dcount=1 then
+						if interf.I.ramsel='0' then 
+							Interf.O.membusy<='1';
+							dcount :=dcount+1;
+						end if;
+						SysRam.O.we<='1';
+						SysRam.O.ena<='1';
+						SysRam.O.enb<='1';
+						SysRam.O.Data_in<=data;
+						SysRam.O.Addr_wr<=adrToSet;
+				elsif dcount=2 then
+				  SysRam.O.we<='1';
+							SysRam.O.ena<='1';
+							SysRam.O.enb<='1';
+						SysRam.O.Data_in<=data;
+						dcount :=dcount+1;
+						SysRam.O.Addr_wr<=AdrToSet;
+				elsif dcount=3 then
+						Interf.O.membusy<='1';
+						dcount :=dcount+1;
+						SysRam.O.Addr_wr<=adrToSet;
+						SysRam.O.Data_in<=data;
+				elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
+						dcount:=0;
+						Interf.O.membusy<='0';
+						SysRam.O.Addr_wr<=AdrToSet;		
+				end if;
+					
+					NextCtx:=dcount;
+end procedure;
+
+-- écriture dans la mémoire
+procedure ReadMem( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+						AdrVect:in std_logic_vector; data: out std_logic_vector) is
+--cette procédure permet d'écrire un mot dans la mémoire du PE(tâche matérielle)
+--en ayant vérifié que le bus est bien disponible pour l'écriture
+ variable i,dcount : natural:=0;	
+variable adresse :natural;
+variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
+
+begin
+				if NextCtx /=0 then --préserver la valeur de count entre les appels
+					dcount:=NextCtx;
+				else
+					
+					
+				end if;
+							
+				if dcount=0 then
+					--if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+					--	Interf.O.membusy<='1';
+					--end if;
+											
+						SysRam.O.Addr_rd<=adrToSet;
+				elsif dcount=1 then
+				  if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+					  Interf.O.membusy<='0';
+					 end if;
+						data:=SysRam.I.Data_out;
+						SysRam.O.Addr_rd<=adrToSet;
+						SysRam.O.we<='0';
+							SysRam.O.ena<='0';
+							SysRam.O.enb<='1';
+				elsif dcount=2 then
+				  if interf.I.ramsel='0' then 
+						data:=SysRam.I.Data_out;
+						dcount :=dcount+1;
+					else
+					  dcount:=2;
+					end if;
+					  SysRam.O.we<='0';
+						SysRam.O.ena<='0';
+						SysRam.O.enb<='1';
+						SysRam.O.Addr_rd<=adrToSet;
+				elsif dcount=3 then
+						if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+						SysRam.O.Addr_rd<=adrToSet;
+						data:=SysRam.I.Data_out;
+						Interf.O.membusy<='0';
+						else
+						  dcount:=2;
+						end if;
+						SysRam.O.we<='0';
+						SysRam.O.ena<='0';
+						SysRam.O.enb<='1';
+				elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
+						dcount:=0;
+						Interf.O.membusy<='0';
+						data:=SysRam.I.Data_out;
+				end if;
+					data:=SysRam.I.Data_out;
+					NextCtx:=dcount;
+end procedure;
+
+procedure SetBit( NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+		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
+--cette procédure permet de mettre à jour un Bit un mot dans la mémoire du PE(tâche matérielle)
+--en ayant vérifié que le bus est bien disponible pour l'écriture
+ variable i,dcount : natural:=0;	
+variable adresse :natural;
+variable tempdata:std_logic_vector(Word-1 downto 0);
+
+
+begin
+				if NextCtx /=0 then --préserver la valeur de count entre les appels
+					dcount:=NextCtx;
+				else
+					
+					
+				end if;
+							
+				if dcount=0 then
+					if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+						Interf.O.membusy<='1';
+					end if;
+											
+						SysRam.O.Addr_rd<=adrVect;
+						SysRam.O.Addr_Wr<=adrVect;
+				elsif dcount=1 then
+				  	if interf.I.ramsel='0' then
+						tempdata:=SysRam.I.Data_out;
+						dcount :=dcount+1;
+						SysRam.O.Addr_rd<=adrVect;
+						end if;
+						SysRam.O.enb<='1';
+						SySRam.O.ena<='0';
+						SysRam.O.we<='0';
+				elsif dcount=2 then
+						tempdata:=SysRam.I.Data_out;
+						dcount :=dcount+1;
+						SysRam.O.Addr_rd<=adrVect;
+						SysRam.O.enb<='1';
+						SySRam.O.ena<='0';
+						SysRam.O.we<='0';
+				elsif dcount=3 then
+						if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+						SysRam.O.Addr_Wr<=adrVect;
+						SysRam.O.We<='0';
+						SysRam.O.ena<='0';
+						SysRam.O.enb<='1';
+						tempdata:=SysRam.I.Data_out;
+						Interf.O.membusy<='1';
+						end if;
+				elsif dcount=4 then
+						if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+						SysRam.O.Addr_Wr<=adrVect;
+						SysRam.O.We<='1';
+						SysRam.O.ena<='1';
+						SysRam.O.enb<='1';
+						tempdata:=SysRam.I.Data_out;
+						if BitVal='1' then
+						  TempData:=Tempdata or BitMask;
+						else
+						 TempData:=TempData and not (BitMAsk);
+						end if;
+						SysRam.O.Data_in<=TempData;
+						Interf.O.membusy<='1';
+						end if;
+				elsif dcount=5 then --attente d'écriture
+						if interf.I.ramsel='0' then 
+						dcount :=dcount+1;
+						SysRam.O.Addr_rd<=adrVect;
+						SysRam.O.We<='1';
+						SysRam.O.ena<='1';
+						--SysRam.O.Data_in<=TempData;
+						Interf.O.membusy<='1';
+						end if;
+				elsif dcount=6 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
+						dcount:=0;
+						Interf.O.membusy<='0';
+						SysRam.O.We<='0';
+						SysRam.O.ena<='0';
+						
+				end if;
+					
+					NextCtx:=dcount;
+end procedure;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+procedure WritePtr(AdrVect:in std_logic_vector; count: inout natural;signal SysRam :out typ_dpram) is
+--cette procédure permet d'écrire dans la mémoire du PE(tâche matérielle)
+--les données de l'appel de la procédure
+variable i,dcount : natural:=0;	
+variable adresse :natural;
+variable AdrToSet :std_logic_vector(AdrVect'length-1 downto 0):=AdrVect;
+begin
+				if count /=0 then --préserver la valeur de count entre les appels
+					dcount:=count;
+				else
+					
+					
+				end if;
+				adresse:=Core_base_adr+2;
+				AdrToSet:=AdrVect;	
+				if dcount=0 then
+						SysRam.O.Data_in<=AdrToSet(Word-1 downto 0);
+						dcount :=dcount+1;
+						SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+				elsif dcount=1 then
+				 
+				    SysRam.O.Data_in<=AdrToSet(Word-1 downto 0);
+				    SysRam.O.We<='1';SysRam.O.Ena<='1';
+						dcount :=dcount+1;
+						SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse,ADRLEN));
+						
+				elsif dcount=2 then
+				    SysRam.O.We<='1';SysRam.O.Ena<='1';
+				    SysRam.O.Data_in<=AdrToSet(ADRLEN-1 downto Word);
+						dcount :=dcount+1;
+						SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));
+						SysRam.O.Data_in<=AdrToSet(ADRLEN-1 downto Word);
+				elsif dcount=3 then
+						dcount :=dcount+1;
+						SysRam.O.We<='1';SysRam.O.Ena<='1';
+						SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));
+						SysRam.O.Data_in<=AdrToSet(ADRLEN-1 downto Word);
+				elsif dcount=4 then -- ce cycle permet juste de vider le tampon d'écriture en RAM
+						dcount:=0;
+						SysRam.O.We<='0';SysRam.O.Ena<='0';
+						SysRam.O.Addr_wr<=Std_logic_vector(to_unsigned(adresse+1,ADRLEN));		
+				end if;
+					
+					count:=dcount;
+end procedure;
+--int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr)
+procedure MPI_Alloc_mem(NextCtx : inout natural range 0 to 255;signal Interf:inout Core_io;signal SysRam :inout typ_dpram;
+SIZE : natural; MPI_INFO: natural; baseptr: out  std_logic_vector(ADRLEN-1 downto 0)) is
+begin
+ --baseptr:=std_logic_vector(unsigned(Interf.S.HeapPtr,ADRLEN)); --
+ -- Interf.S.HeapPtr<=Interf.S.HeapPtr+SIZE;
+ baseptr:=(others=>'1');
+end procedure;
+end MPI_Rma;
