OpenCores
URL https://opencores.org/ocsvn/jtag_stapl_player/jtag_stapl_player/trunk

Subversion Repositories jtag_stapl_player

[/] [jtag_stapl_player/] [trunk/] [idcode.jam] - Rev 2

Compare with Previous | Blame | View Log

NOTE "CREATOR" "Altera Chain Interrogation Version 5.0";
'               Copyright (c) 1999-2007 Altera Corporation.  All Rights Reserved.
'               File name:  IDCODE.JAM

NOTE "DATE" "2007/12/24";
NOTE "ALG_VERSION" "1";
NOTE "STAPL_VERSION" "JESD71";
NOTE "MAX_FREQ" "10000000";

ACTION read_idcode = header                    RECOMMENDED,
                     check_chain               RECOMMENDED,
                     compute_number_of_devices RECOMMENDED,
                     compute_ir_length         RECOMMENDED,
                     read_the_idcode           RECOMMENDED,
                     device_identifier         RECOMMENDED,
                     exiting;

DATA data_chain;
  ' Global Constants
  INTEGER max_num_devices = 100;
  INTEGER max_ir_length = 1020; 'Suggested value (max_devices)*10 + ~20 extra
  INTEGER max_idlength = max_num_devices * 32;
  BOOLEAN all_zeros[3200];
  BOOLEAN all_ones[3200] =   $FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
  BOOLEAN zeros_ones[max_ir_length*2] 
                           = $FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                              0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                              0000000000000000000000000000000000000000000000000000000;
  BOOLEAN patterns[3200] =   $FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4321;
  BOOLEAN id_capture[3200] = $FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
                              FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
  ' Global Variables
  INTEGER num_devices = max_num_devices; 'Initialize to max_num_devices in case compute_number_of_devices is skipped.
  BOOLEAN read_instruction[1600];
  INTEGER ir_length;
  BOOLEAN ir_capture[max_ir_length];
  INTEGER device_list[max_num_devices]; 'Stores a list of integers representing the device names
  BOOLEAN read_data[2*max_ir_length];
  BOOLEAN stuck_tdo_flag; 'temporary flag
  INTEGER i_device;
  INTEGER offset;
  BOOLEAN idval[32];
  BOOLEAN id_match;
  BOOLEAN id_match_cum;
ENDDATA;

PROCEDURE header;
  PRINT "******************************************************************************";
  PRINT "* Altera Chain Interrogation Version 5.0                                     *";
  PRINT "*   Copyright (c) 1999-2007 Altera Corporation.  All Rights Reserved.        *";
ENDPROC;

PROCEDURE check_chain USES data_chain;
  PRINT "******************************************************************************";
  PRINT "Chain Continuity Checker";
  STATE RESET;
  IRSCAN max_ir_length, all_ones[(max_ir_length-1)..0], COMPARE all_ones[(max_ir_length-1)..0], all_ones[(max_ir_length-1)..0], stuck_tdo_flag;
  IF (stuck_tdo_flag == 1) THEN PRINT "  ****************************************************************************";
  IF (stuck_tdo_flag == 1) THEN PRINT "  *** Chain Continuity Failure (1) -- IR is returning TDO with all ones    ***";
  IF (stuck_tdo_flag == 1) THEN PRINT "  *** Check Cable Connection; Check Cable Power; Check Signal Integrity    ***";
  IF (stuck_tdo_flag == 1) THEN PRINT "  *** Check TDO connection; Check TDO polarity of Player                   ***";
  IF (stuck_tdo_flag == 1) THEN PRINT "  ****************************************************************************";
  IF (stuck_tdo_flag == 1) THEN EXIT (1);
  STATE RESET;
  IRSCAN max_ir_length, all_ones[(max_ir_length-1)..0], COMPARE all_zeros[(max_ir_length-1)..0], all_ones[(max_ir_length-1)..0], stuck_tdo_flag;
  IF (stuck_tdo_flag == 1) THEN PRINT "  ****************************************************************************";
  IF (stuck_tdo_flag == 1) THEN PRINT "  *** Chain Continuity Failure (2) -- IR is returning with TDO all zeros   ***";
  IF (stuck_tdo_flag == 1) THEN PRINT "  *** Check Board Power; Check Cable Power; Check Signal Integrity         ***";
  IF (stuck_tdo_flag == 1) THEN PRINT "  ****************************************************************************";
  IF (stuck_tdo_flag == 1) THEN EXIT (1);
  'XXXXXXXXX Should add test for leading 10 for IR capture of first device
  PRINT "  Chain Continuity during IR is not stuck at zero or one";
  'XXXXXXXXX Should add test for known pattern coming out of TDO
ENDPROC;

PROCEDURE compute_number_of_devices USES data_chain;
  PRINT "******************************************************************************";
  PRINT "Chain Length -- Load IR of all ones then count DR length";
  INTEGER device_count;
  num_devices = 0;
  STATE RESET;
  IRSCAN max_ir_length, all_ones[max_ir_length-1..0], CAPTURE ir_capture[max_ir_length-1..0];
  DRSCAN (max_num_devices+1+16), patterns[max_num_devices+16..0], CAPTURE read_data[max_num_devices+16..0];
  FOR device_count=0 TO max_num_devices - 1;
    IF (read_data[device_count] == 0) THEN num_devices = num_devices + 1;
    IF (read_data[device_count] != 0) THEN device_count = max_num_devices - 1; 'terminating condition
  NEXT device_count;
  BOOLEAN pattern_det;
  pattern_det =   (read_data[num_devices     ] == 1)  'Array compare to value $4321
               && (read_data[num_devices +  1] == 0)
               && (read_data[num_devices +  2] == 0)
               && (read_data[num_devices +  3] == 0)
               && (read_data[num_devices +  4] == 0)
               && (read_data[num_devices +  5] == 1)
               && (read_data[num_devices +  6] == 0)
               && (read_data[num_devices +  7] == 0)
               && (read_data[num_devices +  8] == 1)
               && (read_data[num_devices +  9] == 1)
               && (read_data[num_devices + 10] == 0)
               && (read_data[num_devices + 11] == 0)
               && (read_data[num_devices + 12] == 0)
               && (read_data[num_devices + 13] == 0)
               && (read_data[num_devices + 14] == 1)
               && (read_data[num_devices + 15] == 0);

  IF (pattern_det == 0) THEN PRINT "  ****************************************************************************";
  IF (pattern_det == 0) THEN PRINT "  *** Chain Continuity Failure (3) -- DR of Bypass detects an unexpected   ***";
  IF (pattern_det == 0) THEN PRINT "  *** non-zero pattern                                                     ***";
  IF (pattern_det == 0) THEN PRINT "  *** Check JTAG Chain -- Probably a break in TDI to TDO chain between     ***";
  IF (pattern_det == 0) THEN PRINT "  *** devices #",num_devices," and #", num_devices+1, " (counting from TDO) because ", num_devices, " zeros were shifted   ***";
  IF (pattern_det == 0) THEN PRINT "  *** out successfully before encountering the unexpected values.          ***";
  IF (pattern_det == 0) THEN PRINT "  *** Check Signal Integrity                                               ***";
  IF (pattern_det == 0) THEN PRINT "  ****************************************************************************";
  IF (pattern_det == 0) THEN EXIT(2);
  PRINT "  Number of Devices is ", num_devices;
  IF (num_devices == 0) THEN PRINT "  ****************************************************************************";
  IF (num_devices == 0) THEN PRINT "  *** Chain Continuity Failure (4) -- DR of Bypass shows Chain length of   ***";
  IF (num_devices == 0) THEN PRINT "  *** zero devices                                                         ***";
  IF (num_devices == 0) THEN PRINT "  *** Check JTAG Chain; Check Signal Integrity                             ***";
  IF (num_devices == 0) THEN PRINT "  ****************************************************************************";
  IF (num_devices == 0) THEN EXIT(2);
  IF (num_devices > 100) THEN PRINT "  ****************************************************************************";
  IF (num_devices > 100) THEN PRINT "  *** Error: Number devices in chain exceeds maximum number of devices     ***";
  IF (num_devices > 100) THEN PRINT "  *** that this file can support.                                          ***";
  IF (num_devices > 100) THEN PRINT "  ****************************************************************************";
  IF (num_devices > 100) THEN EXIT(2);
ENDPROC;

PROCEDURE compute_ir_length USES data_chain;
  PRINT "******************************************************************************";
  PRINT "IR Length Calculator";
  IRSCAN max_ir_length*2, zeros_ones[(max_ir_length*2-1)..0], CAPTURE read_data[(max_ir_length*2-1)..0];
  ir_length = 0;
  INTEGER i_irlen;
  FOR i_irlen = (max_ir_length) TO (max_ir_length*2-1);
    IF (read_data[i_irlen] == 0) THEN ir_length = ir_length + 1;
  NEXT i_irlen;
  PRINT "  Instruction Register Length is ", ir_length;
ENDPROC;

PROCEDURE read_the_idcode USES data_chain;
  PRINT "******************************************************************************";
  PRINT "IDCODE Reader";
  STATE RESET;
  DRSCAN max_idlength, all_ones[max_idlength-1..0], CAPTURE id_capture[max_idlength-1..0];
  PRINT "  ---------- | ---- ------------------- ------------- - |"; 
  PRINT "  TDO -> TDI | Rev  Device              Mfgr          1 |"; 
  PRINT "  ---------- | ---- ------------------- ------------- - |";
  offset = 0;
  FOR i_device = 1 to num_devices;
    IF (id_capture[offset] == 0) THEN GOTO no_optional_idcode_read;
      'IDCODE supported
      PRINT "  Device #", i_device, "  | " , 
        'revision
        id_capture[offset + 31], id_capture[offset + 30], id_capture[offset + 29], id_capture[offset + 28], " ",
        'device
        id_capture[offset + 27], id_capture[offset + 26], id_capture[offset + 25], id_capture[offset + 24], " ",
        id_capture[offset + 23], id_capture[offset + 22], id_capture[offset + 21], id_capture[offset + 20], " ",
        id_capture[offset + 19], id_capture[offset + 18], id_capture[offset + 17], id_capture[offset + 16], " ",  
        id_capture[offset + 15], id_capture[offset + 14], id_capture[offset + 13], id_capture[offset + 12], " ",
        'vendor
        id_capture[offset + 11], id_capture[offset + 10], id_capture[offset +  9], id_capture[offset +  8], " ",
        id_capture[offset +  7], id_capture[offset +  6], id_capture[offset +  5], id_capture[offset +  4], " ",
        id_capture[offset +  3], id_capture[offset +  2], id_capture[offset +  1], " ",  
        'mandatory 1
        id_capture[offset], " | ";
       offset = offset + 32;
        GOTO end_device_idcode_read;
      'IDCODE not supported
      no_optional_idcode_read:
        PRINT "  Device #", i_device, "  | .... .... .... .... .... .... .... ... 0 | No IDCODE support";
        offset = offset+1;
    end_device_idcode_read:  
  NEXT i_device;
  PRINT "  ---------- | ---- ------------------- ------------- - |"; 
  ' Should add test for remaining bits being 1
ENDPROC;

PROCEDURE device_identifier USES data_chain, compare_one_idval, compare_known_idvals;
  PRINT "******************************************************************************";
  PRINT "Device Identifier -- Search for device name from list of device IDCODE values";
  PRINT "  ---------- |      ------------------- -------------   |"; 
  PRINT "  TDO -> TDI |      Device              Mfgr            |"; 
  PRINT "  ---------- |      ------------------- -------------   |";
  offset = 0;
  FOR i_device = 1 to num_devices;
    IF (id_capture[offset] == 0) THEN GOTO no_optional_idcode_ident;
    'IDCODE supported
      CALL compare_known_idvals;
      offset = offset + 32;
      GOTO end_device_idcode_ident;
    'IDCODE not supported
    no_optional_idcode_ident:
      PRINT "  Device #", i_device, "  |      No IDCODE support                   |";
      offset = offset+1;
    end_device_idcode_ident:  
  NEXT i_device;
  PRINT "  ---------- |      ------------------- ------------- - |";
  ' Should add test for remaining bits being 1
ENDPROC;

PROCEDURE compare_known_idvals USES data_chain, compare_one_idval;
  id_match_cum = 0;
  '***** Altera MAX 7000 *****
  idval[31..0] = $070320DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7032S            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 1;
  idval[31..0] = $070640DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7064S            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 2;
  idval[31..0] = $070960DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7096S            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 3;
  idval[31..0] = $071280DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7128S/A          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 4;
  idval[31..0] = $071600DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7160S            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 5;
  idval[31..0] = $071920DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7192S            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 6;
  idval[31..0] = $072560DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7256S/A          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 7;
  idval[31..0] = $170320DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7032AE/EPM3032A  Altera          |"; IF id_match == 1 THEN device_list[i_device] = 8;
  idval[31..0] = $170640DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7064AE/EPM3064A  Altera          |"; IF id_match == 1 THEN device_list[i_device] = 9;
  idval[31..0] = $171280DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7128AE/EPM3128A  Altera          |"; IF id_match == 1 THEN device_list[i_device] = 10;
  idval[31..0] = $172560DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7256AE/EPM3256A  Altera          |"; IF id_match == 1 THEN device_list[i_device] = 11;
  idval[31..0] = $175120DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7512AE/EPM3512A  Altera          |"; IF id_match == 1 THEN device_list[i_device] = 12;
  idval[31..0] = $270320DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7032B            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 13;
  idval[31..0] = $270640DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7064B            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 14;
  idval[31..0] = $271280DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7128B            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 15;
  idval[31..0] = $272560DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7256B            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 16;
  idval[31..0] = $275120DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM7512B            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 17;

  '***** Altera MAX 9000 *****
  idval[31..0] = $093200DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM9320/A           Altera          |"; IF id_match == 1 THEN device_list[i_device] = 18;
  idval[31..0] = $094000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM9400             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 19;
  idval[31..0] = $094800DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM9480             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 20;
  idval[31..0] = $095600DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM9560/A           Altera          |"; IF id_match == 1 THEN device_list[i_device] = 21;

  '***** Altera MAX II *****
  idval[31..0] = $020A10DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM240              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 22;
  idval[31..0] = $020A20DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM570              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 23;
  idval[31..0] = $020A30DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM1270             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 24;
  idval[31..0] = $020A40DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM2210             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 25;
  idval[31..0] = $020A50DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM240Z             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 26;
  idval[31..0] = $020A60DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPM570Z             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 27;

  '***** Altera EPC *****
  idval[31..0] = $010020DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPC2                Altera          |"; IF id_match == 1 THEN device_list[i_device] = 28;
  idval[31..0] = $0100A0DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPC4/EPC8/EPC16     Altera          |"; IF id_match == 1 THEN device_list[i_device] = 29;

  '***** Altera APEX 20K/E/C *****
  idval[31..0] = $004160DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K100            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 30;
  idval[31..0] = $008320DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K200            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 31;
  idval[31..0] = $016640DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K400            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 32;
  idval[31..0] = $080300DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K30E            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 33;
  idval[31..0] = $080600DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K60E            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 34;
  idval[31..0] = $081000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K100E           Altera          |"; IF id_match == 1 THEN device_list[i_device] = 35;
  idval[31..0] = $081600DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K160E           Altera          |"; IF id_match == 1 THEN device_list[i_device] = 36;
  idval[31..0] = $082000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K200E/C         Altera          |"; IF id_match == 1 THEN device_list[i_device] = 37;
  idval[31..0] = $083000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K300E           Altera          |"; IF id_match == 1 THEN device_list[i_device] = 38;
  idval[31..0] = $084000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K400E/C         Altera          |"; IF id_match == 1 THEN device_list[i_device] = 39;
  idval[31..0] = $086000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K600E/C         Altera          |"; IF id_match == 1 THEN device_list[i_device] = 40;
  idval[31..0] = $090000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K1000E/C        Altera          |"; IF id_match == 1 THEN device_list[i_device] = 41;
  idval[31..0] = $095000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP20K1500E          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 42;

  '***** Altera APEX II *****
  idval[31..0] = $0C4000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2A15              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 43;
  idval[31..0] = $0C6000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2A25              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 44;
  idval[31..0] = $0D0000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2A40              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 45;
  idval[31..0] = $0E0000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2A70              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 46;

  '***** Altera FLEX10K/E and ACEX 1K *****
  idval[31..0] = $010100DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K10/A          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 47;
  idval[31..0] = $010200DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K20            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 48;
  idval[31..0] = $010300DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K30/A          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 49;
  idval[31..0] = $010400DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K40            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 50;
  idval[31..0] = $010500DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K50/V          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 51;
  idval[31..0] = $010700DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K70            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 52;
  idval[31..0] = $001000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K100/A         Altera          |"; IF id_match == 1 THEN device_list[i_device] = 53;
  idval[31..0] = $001300DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K130V          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 54;
  idval[31..0] = $002500DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K250A          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 55;
  idval[31..0] = $101000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K100B          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 56;
  idval[31..0] = $110100DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1K10              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 57;
  idval[31..0] = $110300DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1K30/EPF10K30E    Altera          |"; IF id_match == 1 THEN device_list[i_device] = 58;
  idval[31..0] = $110500DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1K50/EPF10K50E/S  Altera          |"; IF id_match == 1 THEN device_list[i_device] = 59;
  idval[31..0] = $201000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1K100/EPF10K100E  Altera          |"; IF id_match == 1 THEN device_list[i_device] = 60;
  idval[31..0] = $101300DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K130E          Altera          |"; IF id_match == 1 THEN device_list[i_device] = 61;
  idval[31..0] = $102000DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EPF10K200E/S        Altera          |"; IF id_match == 1 THEN device_list[i_device] = 62;

  '***** Altera Stratix *****
  idval[31..0] = $020010DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1S10              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 63;
  idval[31..0] = $020020DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1S20              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 64;
  idval[31..0] = $020030DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1S25              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 65;
  idval[31..0] = $020040DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1S30              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 66;
  idval[31..0] = $020050DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1S40              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 67;
  idval[31..0] = $020060DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1S60              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 68;
  idval[31..0] = $020070DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1S80              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 69; 

  '***** Altera Stratix II*****
  idval[31..0] = $020910DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2S15              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 70;
  idval[31..0] = $020920DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2S30              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 71;
  idval[31..0] = $120930DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2S60              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 72;
  idval[31..0] = $020940DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2S90              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 73;
  idval[31..0] = $020950DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2S130             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 74;
  idval[31..0] = $020960DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2S180             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 75;

'***** Altera Stratix III *****
  idval[31..0] = $021080DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SL50             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 76;
  idval[31..0] = $021010DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SL70             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 77;
  idval[31..0] = $021090DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SL110            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 78;
  idval[31..0] = $021020DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SL150            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 79;
  idval[31..0] = $021030DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SL200            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 80;
  idval[31..0] = $021050DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SL340            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 81;
  idval[31..0] = $021060DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SE50             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 82;
  idval[31..0] = $0210A0DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SE80             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 83;
  idval[31..0] = $021070DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SE110            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 84;
  idval[31..0] = $021040DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3SE260            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 85;

  '***** Altera Stratix GX *****
  idval[31..0] = $020410DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1SGX10            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 86;
  idval[31..0] = $020430DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1SGX25            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 87;
  idval[31..0] = $020450DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1SGX40            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 88;

'***** Altera Stratix II GX *****
  idval[31..0] = $020E10DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2SGX30            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 89;
  idval[31..0] = $020E20DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2SGX60            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 90;
  idval[31..0] = $020E30DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2SGX90            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 91;
  idval[31..0] = $020E40DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2SGX130           Altera          |"; IF id_match == 1 THEN device_list[i_device] = 92;

'***** Altera Arria GX *****
  idval[31..0] = $021210DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1AGX20            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 93;
  idval[31..0] = $021210DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1AGX35            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 94;
  idval[31..0] = $021220DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1AGX50            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 95;
  idval[31..0] = $021220DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1AGX60            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 96;
  idval[31..0] = $021230DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1AGX90            Altera          |"; IF id_match == 1 THEN device_list[i_device] = 97;

  '***** Altera Cyclone *****
  idval[31..0] = $020810DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1C3               Altera          |"; IF id_match == 1 THEN device_list[i_device] = 98;
  idval[31..0] = $020850DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1C4               Altera          |"; IF id_match == 1 THEN device_list[i_device] = 99;
  idval[31..0] = $020820DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1C6               Altera          |"; IF id_match == 1 THEN device_list[i_device] = 100;
  idval[31..0] = $020830DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1C12              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 101;
  idval[31..0] = $020840DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP1C20              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 102;

  '***** Altera Cyclone II*****
  idval[31..0] = $020B10DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2C5               Altera          |"; IF id_match == 1 THEN device_list[i_device] = 103;
  idval[31..0] = $020B20DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2C8               Altera          |"; IF id_match == 1 THEN device_list[i_device] = 104;
  idval[31..0] = $020B30DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2C20              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 105;
  idval[31..0] = $020B40DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2C35              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 106;
  idval[31..0] = $020B50DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2C50              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 107;
  idval[31..0] = $020B60DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP2C70              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 108;

  '***** Altera Cyclone III*****
  idval[31..0] = $020F10DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C5               Altera          |"; IF id_match == 1 THEN device_list[i_device] = 109;
  idval[31..0] = $020F10DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C10              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 110;
  idval[31..0] = $020F20DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C16              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 111;
  idval[31..0] = $020F30DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C25              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 112;
  idval[31..0] = $020F40DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C40              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 113;
  idval[31..0] = $020F50DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C55              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 114;
  idval[31..0] = $020F60DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C80              Altera          |"; IF id_match == 1 THEN device_list[i_device] = 115;
  idval[31..0] = $020F70DD;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      EP3C120             Altera          |"; IF id_match == 1 THEN device_list[i_device] = 116;
  
  '***** Xilinx XC9500 (Xilinx does weird stuff with their version number) *****
  idval[31..0] = $09502093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9536              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 117;
  idval[31..0] = $29502093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9536(rev2)        Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 118;
  idval[31..0] = $09504093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9572              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 119;
  idval[31..0] = $19504093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9572(rev1)        Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 120;
  idval[31..0] = $29504093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9572(rev2)        Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 121;
  idval[31..0] = $09506093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95108             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 122;
  idval[31..0] = $19506093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95108(rev1)       Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 123;
  idval[31..0] = $29506093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95108(rev2)       Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 124;
  idval[31..0] = $09508093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95144             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 125;
  idval[31..0] = $09512093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95216             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 126;
  idval[31..0] = $19512093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95216(rev1)       Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 127;
  idval[31..0] = $29512093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95216(rev2)       Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 128;
  idval[31..0] = $09516093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95288             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 129;
  idval[31..0] = $29516093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95288(rev2)       Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 130;

  '***** Xilinx XC9500XL (Xilinx does weird stuff with their version number) *****
  idval[31..0] = $09602093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9536XL            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 131;
  idval[31..0] = $19602093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9536XL(rev1)      Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 132;
  idval[31..0] = $29602093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9536XL(rev2)      Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 133;
  idval[31..0] = $09604093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9572XL            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 134;
  idval[31..0] = $29504093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC9572(rev2)        Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 135;
  idval[31..0] = $09616093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95288XL           Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 136;
  idval[31..0] = $29616093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC95288XL(rev2)     Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 137;

  '***** Xilinx Virtex (Xilinx does weird stuff with their version number) *****
  idval[31..0] = $20610093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV50               Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 138;
  idval[31..0] = $20614093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV100              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 139;
  idval[31..0] = $20618093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV150              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 140;
  idval[31..0] = $2061C093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV200              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 141;
  idval[31..0] = $20620093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV300              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 142;
  idval[31..0] = $20628093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV400              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 143;
  idval[31..0] = $20630093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV600              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 144;
  idval[31..0] = $20638093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV800              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 145;
  idval[31..0] = $20640093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV1000             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 146;

  '***** Xilinx Virtex-E (Xilinx does weird stuff with their version number) *****
  idval[31..0] = $20A10093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV50E              Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 147;
  idval[31..0] = $20A14093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV100E             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 148;
  idval[31..0] = $20A1C093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV200E             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 149;
  idval[31..0] = $20A20093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV300E             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 150;
  idval[31..0] = $20A28093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV400E             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 151;
  idval[31..0] = $20A30093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV600E             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 152;
  idval[31..0] = $20A40093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV1000E            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 153;
  idval[31..0] = $20A48093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV1600E            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 154;
  idval[31..0] = $20A50093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV2000E            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 155;
  idval[31..0] = $20A5C093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV2600E            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 156;
  idval[31..0] = $20A68093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XCV3200E            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 157;

  '***** Xilinx Config Device (Xilinx does weird stuff with their version number) *****
  idval[31..0] = $05024093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC18V01             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 158;
  idval[31..0] = $05025093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC18V02             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 159;
  idval[31..0] = $05026093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC18V04             Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 160;
  idval[31..0] = $05022093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC18V256            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 161;
  idval[31..0] = $05023093;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      XC18V512            Xilinx          |"; IF id_match == 1 THEN device_list[i_device] = 162;

  '***** Lattice Mach-5 *****
  idval[31..0] = $07815003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-128/68-T100      Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 163;
  idval[31..0] = $07817003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-128/68-P100      Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 164;
  idval[31..0] = $07819003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-128/104-P144     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 165;
  idval[31..0] = $0781B003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-128/120-P160     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 166;
  idval[31..0] = $07825003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-192/68-T100      Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 167;
  idval[31..0] = $07827003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-192/68-P100      Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 168;
  idval[31..0] = $07829003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-192/104-P144     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 169;
  idval[31..0] = $0782B003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-192/120-P160     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 170;
  idval[31..0] = $0782F003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-192/160-P208     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 171;
  idval[31..0] = $07845003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-256/68-T100      Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 172;
  idval[31..0] = $07847003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-256/68-P100      Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 173;
  idval[31..0] = $07849003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-256/104-P144     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 174;
  idval[31..0] = $0784B003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-256/120-P160     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 175;
  idval[31..0] = $0784F003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-256/160-P208     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 176;
  idval[31..0] = $07851003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-320/120-P160     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 177;
  idval[31..0] = $07853003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-320/160-P208     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 178;
  idval[31..0] = $07857003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-320/192-B256     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 179;
  idval[31..0] = $07863003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-384/160-P208     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 180;
  idval[31..0] = $07873003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-512/160-P208     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 181;
  idval[31..0] = $07879003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5-512/256-B352     Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 182;

  '***** Lattice Mach-5LV *****
  idval[31..0] = $07814003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-128/68-T100    Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 183;
  idval[31..0] = $07816003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-128/68-P100    Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 184;
  idval[31..0] = $07810003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-128/74-T100    Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 185;
  idval[31..0] = $07812003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-128/104-T144   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 186;
  idval[31..0] = $07818003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-128/104-P144   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 187;
  idval[31..0] = $0781A003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-128/120-P160   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 188;
  idval[31..0] = $07846003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-256/68-P100    Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 189;
  idval[31..0] = $07840003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-256/74-T100    Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 190;
  idval[31..0] = $07848003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-256/104-P144   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 191;
  idval[31..0] = $07842003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-256/104-T144   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 192;
  idval[31..0] = $0784B003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-256/120-P160   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 193;
  idval[31..0] = $0784E003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-256/160-P208   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 194;
  idval[31..0] = $07850003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-320/120-P160   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 195;
  idval[31..0] = $07852003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-320/160-P208   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 196;
  idval[31..0] = $07856003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-320/192-B256   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 197;
  idval[31..0] = $07860003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-384/120-P160   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 198;
  idval[31..0] = $07862003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-384/160-P208   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 199;
  idval[31..0] = $07870003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-512/120-P160   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 200;
  idval[31..0] = $07872003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-512/160-P208   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 201;
  idval[31..0] = $07878003;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      M5LV-512/256-B352   Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 202;

  '***** Lattice ispLSI5000VE *****
  idval[31..0] = $0036A043;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      ISPLSI5512VE        Lattice         |"; IF id_match == 1 THEN device_list[i_device] = 203;
  
'***** Cypress Delta 39K *****
  idval[31..0] = $00031069;  CALL compare_one_idval; IF id_match == 1 THEN PRINT "  Device #", i_device, "  |      CY39100             Cypress         |"; IF id_match == 1 THEN device_list[i_device] = 204;

  '***** ADDING ADDITIONAL DEVICES                                                       *****
  '***** Users of this file are welcome to add as many other devices as they wish here.  *****
  '***** Each additional entry must be for a particular unique 32-bit value for IDCODE.  *****
  '***** Suggest copying one of the above lines and edit the idval, string and device    *****
  '***** list index.

  IF id_match_cum == 0 THEN                                                PRINT "  Device #", i_device, "  |      Unknown IDCODE                      |"; IF id_match == 1 THEN device_list[i_device] = 0;
ENDPROC;

PROCEDURE compare_one_idval USES data_chain;
' This entire function exists because boolean array comparisons are not supported.
  id_match = 1;
  INTEGER i_32;
  FOR i_32 = 0 to 31;
    id_match = id_match && (idval[i_32] == id_capture[offset + i_32]);
  NEXT i_32;
  id_match_cum = id_match || id_match_cum;
ENDPROC;

PROCEDURE exiting;
  PRINT "******************************************************************************";
  EXIT (0);
ENDPROC;

CRC F760;

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.