//---------------------------------------------------------
// SRAM - TSOP44: XJEase device file
// SRAM_TSOP44.xje Revision: 1.17
// (c)2001-2007 XJTAG Limited
//
// Disclaimer: XJTAG makes no guarantees whatsoever
// about this code.  You use it at your own risk.
// This code requires XJTAG version 1.4 or later.
//
// This file tests Non-JTAG SRAM using Test()(INT result)
//---------------------------------------------------------

DEVICE NAME := "SRAM TSOP44"

  PINS
    ADDRESS := 44, 43, 42, 27, 26, 25, 24, 21, 20, 19, 18, 5, 4, 3, 2, 1;
    /*
      // Alternative address pinouts - select the appropriate one.
      ADDRESS := 44, 43, 42, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 5, 4, 3, 2, 1;
      ADDRESS := 18, 19, 20, 21, 22, 24, 25, 26, 27, 42, 43, 44, 1, 2, 3, 4, 5;
    */
    DATA    := 38, 37, 36, 35, 32, 31, 30, 29, 16, 15, 14, 13, 10, 9, 8, 7;
    nOE     := 41;
    nWE     := 17;
    nCE     := 6;
    nBHE    := 40;
    nBLE    := 39;
  END;

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

  TEST COVERAGE
    ADDRESS := SHORTS OPEN HI LO;
    DATA    := SHORTS OPEN HI LO;
    nOE     := OPEN HI LO;
    nWE     := OPEN HI LO;
    nCE     := OPEN HI LO;
    nBHE    := OPEN HI LO;
    nBLE    := 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_FAIL := TRUE;
CONST INT RESULT_PASS := FALSE;
CONST INT DEBUG := FALSE;



//------------------------------------------------------
// Memory Test. Returns 1 for a failure, 0 for a pass.
// Calls MemTest (memtestSRAM.xje) and tests nOE pin,
// nBLE pin, and nBHE 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("Testing nBLE...\n");
  TestnBLE()(result); 
  
  IF (result = RESULT_FAIL) THEN
    PRINT("Memory chip ", DEVICE_REF, " FAILED...\n\n");
    RETURN;
  END;
  
  PRINT("Testing nBHE...\n");
  TestnBHE()(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;

  // Write a known value to the first address.
  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 := ~0[(NCE_BUS_WIDTH-1)..0], 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;


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

  INT data WIDTH DATA_BUS_WIDTH;
  result := RESULT_PASS;

  WriteCycle(0,0,0); // ensure 0 starts at address 0
  
  IF DEBUG THEN PRINT("\tTrying to write 0xFF to 0x0 with nBLE held high\n"); END;
  SET ADDRESS := 0, DATA := 0xFF, nCE := 0, nBLE := 1, nBHE := 0;
  SET nWE := 0;
  SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nWE := 1, nBLE := 1, nBHE := 1;

  SET DATA := 0;
  ReadCycle(0)(data);
  
  IF (data = 0xFF) THEN 
    result := RESULT_FAIL;
    PRINT("Error: nBLE appears to be stuck low.\n");
  END;

END;


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

  INT data WIDTH DATA_BUS_WIDTH;
  result := RESULT_PASS;

  WriteCycle(0,0,0); // ensure 0 starts at address 0
  
  IF DEBUG THEN PRINT("\tTrying to write 0xFF00 to 0x0 with nBHE held high\n"); END;
  SET ADDRESS := 0, DATA := 0xFF00, nCE := 0, nBLE := 0, nBHE := 1;
  SET nWE := 0;
  SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nWE := 1, nBLE := 1, nBHE := 1;

  SET DATA := 0;
  ReadCycle(0)(data);
  
  IF (data = 0xFF00) THEN
    result := RESULT_FAIL;
    PRINT("Error: nBHE 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, INT data, INT byte)()
//----------------------------------------------------------------------------------
  SET ADDRESS := address[(ADDR_BUS_WIDTH-1)..0], DATA := data[(DATA_BUS_WIDTH-1)..0], 
                 nCE := byte[(NCE_BUS_WIDTH-1)..0], nBLE := 0, nBHE := 0;
  SET nWE := 0;
  SET nCE := ~0[(NCE_BUS_WIDTH-1)..0], nWE := 1, nBLE := 1, nBHE := 1;
  IF DEBUG THEN PRINT("\tWrite 0x", HEX(data), " to address 0x", HEX(address), "\n"); END;
END;

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