library ieee;
use ieee.std_logic_1164.all;
use ieee.vital_timing.ALL;
USE ieee.vital_primitives.ALL;

library fmf;
use fmf.gen_utils.all;
use fmf.conversions.all;

package flash is

  component s25fl064a
    generic (
      tipd_SCK            : VitalDelayType01 := VitalZeroDelay01;
      tipd_SI             : VitalDelayType01 := VitalZeroDelay01;
      tipd_CSNeg          : VitalDelayType01 := VitalZeroDelay01;
      tipd_HOLDNeg        : VitalDelayType01 := VitalZeroDelay01;
      tipd_WNeg           : VitalDelayType01 := VitalZeroDelay01;
      tpd_SCK_SO          : VitalDelayType01Z := UnitDelay01Z;
      tpd_CSNeg_SO        : VitalDelayType01Z := UnitDelay01Z;
      tpd_HOLDNeg_SO      : VitalDelayType01Z := UnitDelay01Z;
      tsetup_SI_SCK       : VitalDelayType := UnitDelay;
      tsetup_CSNeg_SCK    : VitalDelayType := UnitDelay;
      tsetup_HOLDNeg_SCK  : VitalDelayType := UnitDelay;
      tsetup_WNeg_CSNeg   : VitalDelayType := UnitDelay;
      thold_SI_SCK        : VitalDelayType := UnitDelay;
      thold_CSNeg_SCK     : VitalDelayType := UnitDelay;
      thold_HOLDNeg_SCK   : VitalDelayType := UnitDelay;
      thold_WNeg_CSNeg    : VitalDelayType := UnitDelay;
      tpw_SCK_posedge     : VitalDelayType := UnitDelay;
      tpw_SCK_negedge     : VitalDelayType := UnitDelay;
      tpw_CSNeg_posedge   : VitalDelayType := UnitDelay;
      tperiod_SCK_rd      : VitalDelayType := UnitDelay;
      tperiod_SCK_fast_rd : VitalDelayType := UnitDelay;
      tdevice_PP          : VitalDelayType    := 3 ms;
      tdevice_SE          : VitalDelayType    := 3 sec;
      tdevice_BE          : VitalDelayType    := 384 sec;
      tdevice_WR          : VitalDelayType    := 60 ms;
      tdevice_DP          : VitalDelayType    := 3 us;
      tdevice_RES         : VitalDelayType    := 30 us;
      tdevice_PU          : VitalDelayType    := 10 ms;
      InstancePath        : STRING    := DefaultInstancePath;
      TimingChecksOn      : BOOLEAN   := DefaultTimingChecks;
      MsgOn               : BOOLEAN   := DefaultMsgOn;
      XOn                 : BOOLEAN   := DefaultXon;
      mem_file_name       : STRING    := "s25fl064a.mem";
      UserPreload         : BOOLEAN   := FALSE;
      LongTimming         : BOOLEAN   := TRUE;
      TimingModel         : STRING    := DefaultTimingModel
      );
    port (
      SCK             : IN    std_ulogic := 'U';
      SI              : IN    std_ulogic := 'U';
      CSNeg           : IN    std_ulogic := 'U';
      HOLDNeg         : IN    std_ulogic := 'U';
      WNeg            : IN    std_ulogic := 'U';
      SO              : OUT   std_ulogic := 'U'
    );
  end component;

  component m25p80
    generic (
      tipd_C            : VitalDelayType01 := VitalZeroDelay01;
      tipd_D            : VitalDelayType01 := VitalZeroDelay01;
      tipd_SNeg         : VitalDelayType01 := VitalZeroDelay01;
      tipd_HOLDNeg      : VitalDelayType01 := VitalZeroDelay01;
      tipd_WNeg         : VitalDelayType01 := VitalZeroDelay01;
      tpd_C_Q           : VitalDelayType01  := UnitDelay01;
      tpd_SNeg_Q        : VitalDelayType01Z := UnitDelay01Z;
      tpd_HOLDNeg_Q     : VitalDelayType01Z := UnitDelay01Z;
      tsetup_D_C        : VitalDelayType := UnitDelay;
      tsetup_SNeg_C     : VitalDelayType := UnitDelay;
      tsetup_HOLDNeg_C  : VitalDelayType := UnitDelay;
      tsetup_C_HOLDNeg  : VitalDelayType := UnitDelay;
      tsetup_WNeg_SNeg  : VitalDelayType := UnitDelay;
      thold_D_C         : VitalDelayType := UnitDelay;
      thold_SNeg_C      : VitalDelayType := UnitDelay;
      thold_HOLDNeg_C   : VitalDelayType := UnitDelay;
      thold_C_HOLDNeg   : VitalDelayType := UnitDelay;
      thold_WNeg_SNeg   : VitalDelayType := UnitDelay;
      tpw_C_posedge     : VitalDelayType := UnitDelay;
      tpw_C_negedge     : VitalDelayType := UnitDelay;
      tpw_SNeg_posedge  : VitalDelayType := UnitDelay;
      tperiod_C_rd      : VitalDelayType := UnitDelay;
      tperiod_C_fast_rd : VitalDelayType := UnitDelay;
      tdevice_PP        : VitalDelayType    := 5 ms;
      tdevice_SE        : VitalDelayType    := 3 sec;
      tdevice_BE        : VitalDelayType    := 20 sec;
      tdevice_WR        : VitalDelayType    := 15 ms;
      tdevice_DP        : VitalDelayType    := 3 us;
      tdevice_RES1      : VitalDelayType    := 3 us;
      tdevice_RES2      : VitalDelayType    := 1.8 us;
      tdevice_VSL       : VitalDelayType    := 10 us;
      tdevice_PUW       : VitalDelayType    := 10 ms;
      InstancePath      : STRING    := DefaultInstancePath;
      TimingChecksOn    : BOOLEAN   := DefaultTimingChecks;
      MsgOn             : BOOLEAN   := DefaultMsgOn;
      XOn               : BOOLEAN   := DefaultXon;
      mem_file_name     : STRING    := "m25p80.mem";
      UserPreload       : BOOLEAN   := FALSE;
      DebugInfo         : BOOLEAN   := FALSE;
      LongTimming       : BOOLEAN   := TRUE;
      TimingModel       : STRING    := DefaultTimingModel
    );
    port (
      C             : IN    std_ulogic := 'U';
      D             : IN    std_ulogic := 'U';
      SNeg          : IN    std_ulogic := 'U';
      HOLDNeg       : IN    std_ulogic := 'U';
      WNeg          : IN    std_ulogic := 'U';
      Q             : OUT   std_ulogic := 'U'
    );
  end component;
  
end flash;

