//------------------------------------------------------
// SRAM_SOP28: XJEase device file
// SRAM_SOP28.xje Revision: 1.4
// (c)2007-2008 XJTAG Limited
//
// Disclaimer: XJTAG makes no guarantees whatsoever
// about this code.  You use it at your own risk ...
//
// If you find any problems with this file, please
// contact support@xjtag.com
//------------------------------------------------------

DEVICE NAME := "SRAM - SOP 28"

  PINS
    ADDRESS := 1, 26, 2, 23, 21, 24, 25, 3, 4, 5, 6, 7, 8, 9, 10;
    DATA    := 19, 18, 17, 16, 15, 13, 12, 11;
    nWE     := 27;
    nOE     := 22;
    nCE     := 20;
  END;

  DISABLE DEVICE
    nOE := 1;
    nCE := 1;
  END;

  TEST COVERAGE
    ADDRESS := SHORTS OPEN HI LO;
    DATA    := SHORTS OPEN HI LO;
    nWE     := OPEN HI LO;
    nOE     := OPEN HI LO;
    nCE     := OPEN HI LO;
  END;
  
  FILES
    "memtestSRAM.xje";
  END;

END;


//------------------------------------------------------
// CONSTANTS
//------------------------------------------------------

CONST INT DATA_BUS_WIDTH := WIDTHOF(DATA);
CONST INT ADDR_BUS_WIDTH := WIDTHOF(ADDRESS);
CONST INT NCE_BUS_WIDTH := WIDTHOF(nCE);

CONST INT RESULT_PASS := FALSE;
CONST INT RESULT_FAIL := TRUE;
CONST INT DEBUG := FALSE;



//------------------------------------------------------
// Memory Test. Returns 1 for a failure, 0 for a pass.
// Calls MemTest (memtestSRAM.xje) and tests nOE pin.
//------------------------------------------------------
Test()(INT result)
//------------------------------------------------------
  
  PRINT("\nTesting memory chip ", DEVICE_REF, "...\n");
  result := RESULT_PASS;

  PRINT("Calling MemTest...\n");
  MemTest()(result);
  IF (result = RESULT_FAIL) THEN
    PRINT("Memory chip ", DEVICE_REF, " FAILED...\n\n");
    RETURN;
  END;

  PRINT("Testing nOE...\n");
  TestnOE()(result); 
  
  IF (result = RESULT_FAIL) THEN
    PRINT("Memory chip ", DEVICE_REF, " FAILED...\n\n");
    RETURN;
  END;

  PRINT("Memory chip ", DEVICE_REF, " PASSED...\n\n");
  
END;


//----------------------------------------------------------------------------------
TestnOE()(INT result WIDTH 1)
//----------------------------------------------------------------------------------

  INT data WIDTH DATA_BUS_WIDTH;
  result := RESULT_PASS;

  WriteCycle(0, 0x55[(DATA_BUS_WIDTH-1)..0],0);

  SET DATA := 0; // Clear Data Bus

  // Test to see if we can read the first address with nOE high.
  SET ADDRESS := 0, DATA := I, nOE :=1, nCE := 0;
  SET nCE := 1, nOE := 1, data := DATA;
  IF DEBUG THEN PRINT("\tTrying to read from address 0x0 with nOE held high\n"); END;

  // If we can, nOE must be stuck low.
  IF data = 0x55[(DATA_BUS_WIDTH-1)..0] THEN
    result := RESULT_FAIL;
    PRINT("Error: nOE appears to be stuck low.\n");
  END;

END;



//----------------------------------------------------------------------------------
// Functions required for use of device file with memtestSRAM.xje
//----------------------------------------------------------------------------------

PrintChipEnable(INT i)()
  PRINT(PINNUM(nCE[i]));
END;

PrintAddr(INT i)()
  PRINT(PINNUM(ADDRESS[i]));
END;
 
PrintData(INT i)()
  PRINT(PINNUM(DATA[i]));
END;

ChipWritable()(INT result)

  IF WRITEABLE(nCE) THEN
    result := TRUE;
  ELSE
    result := FALSE;
  END;

END;



//------------------------------------------------------
WriteCycle(INT address WIDTH ADDR_BUS_WIDTH, INT data WIDTH DATA_BUS_WIDTH, INT byte WIDTH NCE_BUS_WIDTH)()
//------------------------------------------------------
  SET ADDRESS := address[(ADDR_BUS_WIDTH-1)..0], DATA := data[(DATA_BUS_WIDTH-1)..0], nCE := byte[(NCE_BUS_WIDTH-1)..0];
  SET nWE := 0;
  SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nWE := 1;
  IF DEBUG THEN PRINT("\tWrote 0x", HEX(data)," to address 0x", HEX(address),".\n"); END;
END;

//------------------------------------------------------
ReadCycle(INT address WIDTH ADDR_BUS_WIDTH)(INT data WIDTH DATA_BUS_WIDTH)
//------------------------------------------------------
  SET ADDRESS := address[(ADDR_BUS_WIDTH-1)..0], DATA := I, nOE :=0, nCE := 0;
  SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nOE := 1, data := DATA;
  IF DEBUG THEN PRINT("\tJust read 0x", HEX(data)," from address 0x", HEX(address),".\n"); END;
END;