signal lfsr_p, lfsr_plus_one, lfsr_n : std_logic_vector(55 downto 0);
signal first_block_p, first_block_n : boolean;
signal core_reset_n : std_logic;
type FSM_State is (INIT, AD_EVEN, AD_ODD, NONCE, TAG, DONE, MSG, MSG_NONCE);
signal state_p, state_n : FSM_State;
begin
lfsr <= lfsr_p;
domain(0) <= '1' when (incomplete = '1' or empty_msg = '1') and state_p = MSG_NONCE else '0';
domain(1) <= '1' when (incomplete = '1' or empty_ad = '1') and state_p = NONCE else '0';
domain(2) <= '1' when state_p = MSG or state_p = MSG_NONCE or state_p = TAG else '0';
domain(3) <= '1' when state_p = AD_ODD or state_p = AD_EVEN or state_p = NONCE else '0';
domain(4) <= '1' when state_p = NONCE or (state_p = MSG_NONCE and last_block = '1') else '0';
tag_sel <= '0' when state_p = AD_ODD or state_p = MSG else '1';
rho_sel <= '1' when state_p = TAG else '0';
tweak_sel <= '1' when state_p = AD_ODD or state_p = AD_EVEN else '0';
state_sel <= '0' when first_block_p else '1';
tag_clk_en <= '0' when state_p = AD_ODD or state_p = MSG or (core_done = '1' and (state_p = AD_EVEN or state_p = NONCE or state_p = MSG_NONCE)) else '1';
tag_ready <= '1' when state_p = TAG else '0';
cipher_ready <= '1' when state_p = MSG else '0';
read_block <= '1' when (state_p = INIT and empty_ad = '0') or (state_p = AD_ODD and last_block = '0') or (core_done = '1' and ((state_p = MSG_NONCE and last_block = '0') or (state_p = AD_EVEN and last_block = '0') or (state_p = NONCE and empty_msg ='0'))) else '0';
-- check again
aead_done <= '1' when state_p = TAG else '0';
lfsr_0 : entity WORK.lfsr56 port map(lfsr_p, lfsr_plus_one);