diff options
| author | 2012-10-10 10:33:40 +0000 | |
|---|---|---|
| committer | 2012-10-10 10:33:40 +0000 | |
| commit | c8658c8379665de867f0d1e5412fbfda94933c89 (patch) | |
| tree | b69a73cdf07de494c3e44207638f85355e756069 /src/tools | |
| parent | db939b8f51ea5560430ec38852309ba3eaa74dc4 (diff) | |
Refactored the code in jedutil to support the viewing of a GAL16V8 device
and added a new command line option of "-viewlist" which will print out a list
of all the devices that can be viewed in human readable logic equations.
Also updated the jedutil regression test to support passing in an additional argument of "debug" to print out a detailed log. Also moved the jedutil regression test
data into separate directories composed of the device's name to make things
more organized. [Kevin Eshbach]
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/jedutil.c | 1775 |
1 files changed, 1418 insertions, 357 deletions
diff --git a/src/tools/jedutil.c b/src/tools/jedutil.c index 3521db99218..425eed24bfd 100644 --- a/src/tools/jedutil.c +++ b/src/tools/jedutil.c @@ -106,12 +106,33 @@ /*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define ARRAY_LEN(_array) (sizeof(_array) / sizeof(_array[0])) + +#define NO_OUTPUT_ENABLE_FUSE_ROW 0xFFFF + +/* Output pin flags */ +#define OUTPUT_ACTIVELOW 0x00000001 +#define OUTPUT_ACTIVEHIGH 0x00000002 +#define OUTPUT_COMBINATORIAL 0x00000004 +#define OUTPUT_REGISTERED 0x00000008 + +/* Fuse state flag */ +#define LOW_FUSE_BLOWN 0x00000001 +#define HIGH_FUSE_BLOWN 0x00000002 +#define LOWHIGH_FUSE_BLOWN 0x00000004 +#define NO_FUSE_BLOWN 0x00000008 + +/*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ typedef int (*command_func_type)(int argc, char *argv[]); -struct command_entry +typedef struct _command_entry command_entry; +struct _command_entry { const char *command; command_func_type command_func; @@ -120,14 +141,10 @@ struct command_entry /* Pin fuse row configuration */ -#define CNoOutputEnableFuseRow (UINT16)~0 - - - -/* Pin fuse row configuration */ -struct pin_fuse_rows +typedef struct _pin_fuse_rows pin_fuse_rows; +struct _pin_fuse_rows { - UINT16 pin; /* Pin number */ + UINT16 pin; /* Pin number */ UINT16 fuserowoutputenable; /* Fuse row for the output enable */ UINT16 fuserowtermstart; /* Fuse row for the first term */ UINT16 fuserowtermend; /* Fuse row for the last term */ @@ -136,19 +153,22 @@ struct pin_fuse_rows /* Pin fuse column configuration */ -struct pin_fuse_columns +typedef struct _pin_fuse_columns pin_fuse_columns; +struct _pin_fuse_columns { - UINT16 pin; /* Pin number */ + UINT16 pin; /* Pin number */ UINT16 lowfusecolumn; /* Column number for low output */ UINT16 highfusecolumn; /* Column number for high output */ }; -struct pal_data; +typedef struct _pal_data pal_data; typedef void (*print_product_terms_func)(const pal_data* pal, const jed_data* jed); +typedef void (*config_pins_func)(const pal_data* pal, const jed_data* jed); +typedef int (*is_product_term_enabled_func)(const pal_data* pal, const jed_data* jed, UINT16 fuserow); -struct pal_data +struct _pal_data { const char *name; const pin_fuse_rows *pinfuserows; @@ -156,10 +176,21 @@ struct pal_data const pin_fuse_columns *pinfusecolumns; UINT16 pinfusecolumnscount; print_product_terms_func print_product_terms; + config_pins_func config_pins; + is_product_term_enabled_func is_product_term_enabled; }; +/* Pin output configuration */ +typedef struct _pin_output_config pin_output_config; +struct _pin_output_config +{ + UINT16 pin; + UINT16 flags; +}; + + /*************************************************************************** FUNCTION PROTOTYPES ***************************************************************************/ @@ -177,7 +208,8 @@ static void print_pal16l8_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16r4_product_terms(const pal_data* pal, const jed_data* jed); static void print_pal16r6_product_terms(const pal_data* pal, const jed_data* jed); static void print_pal16r8_product_terms(const pal_data* pal, const jed_data* jed); -static void print_gal18v10_product_terms(const pal_data* pal, const jed_data* jed); +static void print_gal16v8_product_terms(const pal_data* pal, const jed_data* jed); +/*static void print_gal18v10_product_terms(const pal_data* pal, const jed_data* jed);*/ static void print_pal20l8_product_terms(const pal_data* pal, const jed_data* jed); static void print_pal20l10_product_terms(const pal_data* pal, const jed_data* jed); static void print_pal20r4_product_terms(const pal_data* pal, const jed_data* jed); @@ -186,6 +218,33 @@ static void print_pal20r8_product_terms(const pal_data* pal, const jed_data* jed +static void config_pal10l8_pins(const pal_data* pal, const jed_data* jed); +static void config_pal10h8_pins(const pal_data* pal, const jed_data* jed); +static void config_pal12l6_pins(const pal_data* pal, const jed_data* jed); +static void config_pal12h6_pins(const pal_data* pal, const jed_data* jed); +static void config_pal14l4_pins(const pal_data* pal, const jed_data* jed); +static void config_pal14h4_pins(const pal_data* pal, const jed_data* jed); +static void config_pal16l2_pins(const pal_data* pal, const jed_data* jed); +static void config_pal16h2_pins(const pal_data* pal, const jed_data* jed); +static void config_pal16c1_pins(const pal_data* pal, const jed_data* jed); +static void config_pal16l8_pins(const pal_data* pal, const jed_data* jed); +static void config_pal16r4_pins(const pal_data* pal, const jed_data* jed); +static void config_pal16r6_pins(const pal_data* pal, const jed_data* jed); +static void config_pal16r8_pins(const pal_data* pal, const jed_data* jed); +static void config_gal16v8_pins(const pal_data* pal, const jed_data* jed); +/*static void config_gal18v10_pins(const pal_data* pal, const jed_data* jed);*/ +static void config_pal20l8_pins(const pal_data* pal, const jed_data* jed); +static void config_pal20l10_pins(const pal_data* pal, const jed_data* jed); +static void config_pal20r4_pins(const pal_data* pal, const jed_data* jed); +static void config_pal20r6_pins(const pal_data* pal, const jed_data* jed); +static void config_pal20r8_pins(const pal_data* pal, const jed_data* jed); + + + +static int is_gal16v8_product_term_enabled(const pal_data* pal, const jed_data* jed, UINT16 fuserow); + + + /*************************************************************************** GLOBAL VARIABLES ***************************************************************************/ @@ -199,68 +258,68 @@ static size_t dstbuflen; static UINT16 inputpins[26]; static UINT16 inputpinscount; -static UINT16 outputpins[26]; +static pin_output_config outputpins[26]; static UINT16 outputpinscount; static pin_fuse_rows pal10l8pinfuserows[] = { - {12, CNoOutputEnableFuseRow, 280, 300}, - {13, CNoOutputEnableFuseRow, 240, 260}, - {14, CNoOutputEnableFuseRow, 200, 220}, - {15, CNoOutputEnableFuseRow, 160, 180}, - {16, CNoOutputEnableFuseRow, 120, 140}, - {17, CNoOutputEnableFuseRow, 80, 100}, - {18, CNoOutputEnableFuseRow, 40, 60}, - {19, CNoOutputEnableFuseRow, 0, 20}}; + {12, NO_OUTPUT_ENABLE_FUSE_ROW, 280, 300}, + {13, NO_OUTPUT_ENABLE_FUSE_ROW, 240, 260}, + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 200, 220}, + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 160, 180}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 120, 140}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 80, 100}, + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 40, 60}, + {19, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 20}}; static pin_fuse_rows pal10h8pinfuserows[] = { - {12, CNoOutputEnableFuseRow, 280, 300}, - {13, CNoOutputEnableFuseRow, 240, 260}, - {14, CNoOutputEnableFuseRow, 200, 220}, - {15, CNoOutputEnableFuseRow, 160, 180}, - {16, CNoOutputEnableFuseRow, 120, 140}, - {17, CNoOutputEnableFuseRow, 80, 100}, - {18, CNoOutputEnableFuseRow, 40, 60}, - {19, CNoOutputEnableFuseRow, 0, 20}}; + {12, NO_OUTPUT_ENABLE_FUSE_ROW, 280, 300}, + {13, NO_OUTPUT_ENABLE_FUSE_ROW, 240, 260}, + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 200, 220}, + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 160, 180}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 120, 140}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 80, 100}, + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 40, 60}, + {19, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 20}}; static pin_fuse_rows pal12l6pinfuserows[] = { - {13, CNoOutputEnableFuseRow, 288, 360}, - {14, CNoOutputEnableFuseRow, 240, 264}, - {15, CNoOutputEnableFuseRow, 192, 216}, - {16, CNoOutputEnableFuseRow, 144, 168}, - {17, CNoOutputEnableFuseRow, 96, 120}, - {18, CNoOutputEnableFuseRow, 0, 72}}; + {13, NO_OUTPUT_ENABLE_FUSE_ROW, 288, 360}, + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 240, 264}, + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 192, 216}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 144, 168}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 96, 120}, + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 72}}; static pin_fuse_rows pal12h6pinfuserows[] = { - {13, CNoOutputEnableFuseRow, 288, 360}, - {14, CNoOutputEnableFuseRow, 240, 264}, - {15, CNoOutputEnableFuseRow, 192, 216}, - {16, CNoOutputEnableFuseRow, 144, 168}, - {17, CNoOutputEnableFuseRow, 96, 120}, - {18, CNoOutputEnableFuseRow, 0, 72}}; + {13, NO_OUTPUT_ENABLE_FUSE_ROW, 288, 360}, + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 240, 264}, + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 192, 216}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 144, 168}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 96, 120}, + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 72}}; static pin_fuse_rows pal14l4pinfuserows[] = { - {14, CNoOutputEnableFuseRow, 336, 420}, - {15, CNoOutputEnableFuseRow, 224, 308}, - {16, CNoOutputEnableFuseRow, 112, 196}, - {17, CNoOutputEnableFuseRow, 0, 84}}; + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 336, 420}, + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 224, 308}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 112, 196}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 84}}; static pin_fuse_rows pal14h4pinfuserows[] = { - {14, CNoOutputEnableFuseRow, 336, 420}, - {15, CNoOutputEnableFuseRow, 224, 308}, - {16, CNoOutputEnableFuseRow, 112, 196}, - {17, CNoOutputEnableFuseRow, 0, 84}}; + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 336, 420}, + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 224, 308}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 112, 196}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 84}}; static pin_fuse_rows pal16l2pinfuserows[] = { - {15, CNoOutputEnableFuseRow, 256, 480}, - {16, CNoOutputEnableFuseRow, 0, 224}}; + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 256, 480}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 224}}; static pin_fuse_rows pal16h2pinfuserows[] = { - {15, CNoOutputEnableFuseRow, 256, 480}, - {16, CNoOutputEnableFuseRow, 0, 224}}; + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 256, 480}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 224}}; static pin_fuse_rows pal16c1pinfuserows[] = { - {15, CNoOutputEnableFuseRow, 256, 480}, - {16, CNoOutputEnableFuseRow, 0, 224}}; + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 480}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 480}}; static pin_fuse_rows pal16l8pinfuserows[] = { {12, 1792, 1824, 2016}, @@ -275,34 +334,44 @@ static pin_fuse_rows pal16l8pinfuserows[] = { static pin_fuse_rows pal16r4pinfuserows[] = { {12, 1792, 1824, 2016}, {13, 1536, 1568, 1760}, - {14, CNoOutputEnableFuseRow, 1280, 1504}, /* Registered Output */ - {15, CNoOutputEnableFuseRow, 1024, 1248}, /* Registered Output */ - {16, CNoOutputEnableFuseRow, 768, 992}, /* Registered Output */ - {17, CNoOutputEnableFuseRow, 512, 736}, /* Registered Output */ + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 1280, 1504}, /* Registered Output */ + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 1024, 1248}, /* Registered Output */ + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 768, 992}, /* Registered Output */ + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 512, 736}, /* Registered Output */ {18, 256, 288, 480}, {19, 0, 32, 224}}; static pin_fuse_rows pal16r6pinfuserows[] = { {12, 1792, 1824, 2016}, - {13, CNoOutputEnableFuseRow, 1536, 1760}, /* Registered Output */ - {14, CNoOutputEnableFuseRow, 1280, 1504}, /* Registered Output */ - {15, CNoOutputEnableFuseRow, 1024, 1248}, /* Registered Output */ - {16, CNoOutputEnableFuseRow, 768, 992}, /* Registered Output */ - {17, CNoOutputEnableFuseRow, 512, 736}, /* Registered Output */ - {18, CNoOutputEnableFuseRow, 256, 480}, /* Registered Output */ + {13, NO_OUTPUT_ENABLE_FUSE_ROW, 1536, 1760}, /* Registered Output */ + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 1280, 1504}, /* Registered Output */ + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 1024, 1248}, /* Registered Output */ + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 768, 992}, /* Registered Output */ + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 512, 736}, /* Registered Output */ + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 256, 480}, /* Registered Output */ {19, 0, 32, 224}}; static pin_fuse_rows pal16r8pinfuserows[] = { - {12, CNoOutputEnableFuseRow, 1792, 2016}, /* Registered Output */ - {13, CNoOutputEnableFuseRow, 1536, 1760}, /* Registered Output */ - {14, CNoOutputEnableFuseRow, 1280, 1504}, /* Registered Output */ - {15, CNoOutputEnableFuseRow, 1024, 1248}, /* Registered Output */ - {16, CNoOutputEnableFuseRow, 768, 992}, /* Registered Output */ - {17, CNoOutputEnableFuseRow, 512, 736}, /* Registered Output */ - {18, CNoOutputEnableFuseRow, 256, 480}, /* Registered Output */ - {19, CNoOutputEnableFuseRow, 0, 224}}; /* Registered Output */ - -static pin_fuse_rows gal18v10pinfuserows[] = { + {12, NO_OUTPUT_ENABLE_FUSE_ROW, 1792, 2016}, /* Registered Output */ + {13, NO_OUTPUT_ENABLE_FUSE_ROW, 1536, 1760}, /* Registered Output */ + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 1280, 1504}, /* Registered Output */ + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 1024, 1248}, /* Registered Output */ + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 768, 992}, /* Registered Output */ + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 512, 736}, /* Registered Output */ + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 256, 480}, /* Registered Output */ + {19, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 224}}; /* Registered Output */ + +static pin_fuse_rows gal16v8pinfuserows[] = { + {12, 0, 0, 0}, + {13, 0, 0, 0}, + {14, 0, 0, 0}, + {15, 0, 0, 0}, + {16, 0, 0, 0}, + {17, 0, 0, 0}, + {18, 0, 0, 0}, + {19, 0, 0, 0}}; + +/*static pin_fuse_rows gal18v10pinfuserows[] = { {9, 3096, 3132, 3384}, {11, 2772, 2808, 3060}, {12, 2448, 2484, 2736}, @@ -312,7 +381,7 @@ static pin_fuse_rows gal18v10pinfuserows[] = { {16, 1008, 1044, 1296}, {17, 684, 720, 972}, {18, 360, 396, 648}, - {19, 36, 72, 324}}; + {19, 36, 72, 324}};*/ static pin_fuse_rows pal20l8pinfuserows[] = { {15, 2240, 2280, 2520}, @@ -339,32 +408,32 @@ static pin_fuse_rows pal20l10pinfuserows[] = { static pin_fuse_rows pal20r4pinfuserows[] = { {15, 2240, 2280, 2520}, {16, 1920, 1960, 2200}, - {17, 1600, 1640, 1840}, - {18, 1280, 1320, 1560}, - {19, 960, 1000, 1240}, - {20, 640, 680, 920}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 1600, 1880}, /* Registered Output */ + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 1280, 1560}, /* Registered Output */ + {19, NO_OUTPUT_ENABLE_FUSE_ROW, 960, 1240}, /* Registered Output */ + {20, NO_OUTPUT_ENABLE_FUSE_ROW, 640, 920}, /* Registered Output */ {21, 320, 360, 600}, {22, 0, 40, 280}}; static pin_fuse_rows pal20r6pinfuserows[] = { {15, 2240, 2280, 2520}, - {16, 1920, 1960, 2200}, - {17, 1600, 1640, 1840}, - {18, 1280, 1320, 1560}, - {19, 960, 1000, 1240}, - {20, 640, 680, 920}, - {21, 320, 360, 600}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 1920, 2200}, /* Registered Output */ + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 1600, 1880}, /* Registered Output */ + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 1280, 1560}, /* Registered Output */ + {19, NO_OUTPUT_ENABLE_FUSE_ROW, 960, 1240}, /* Registered Output */ + {20, NO_OUTPUT_ENABLE_FUSE_ROW, 640, 920}, /* Registered Output */ + {21, NO_OUTPUT_ENABLE_FUSE_ROW, 320, 600}, /* Registered Output */ {22, 0, 40, 280}}; static pin_fuse_rows pal20r8pinfuserows[] = { - {15, 2240, 2280, 2520}, - {16, 1920, 1960, 2200}, - {17, 1600, 1640, 1840}, - {18, 1280, 1320, 1560}, - {19, 960, 1000, 1240}, - {20, 640, 680, 920}, - {21, 320, 360, 600}, - {22, 0, 40, 280}}; + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 2240, 2520}, /* Registered Output */ + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 1920, 2200}, /* Registered Output */ + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 1600, 1880}, /* Registered Output */ + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 1280, 1560}, /* Registered Output */ + {19, NO_OUTPUT_ENABLE_FUSE_ROW, 960, 1240}, /* Registered Output */ + {20, NO_OUTPUT_ENABLE_FUSE_ROW, 640, 920}, /* Registered Output */ + {21, NO_OUTPUT_ENABLE_FUSE_ROW, 320, 600}, /* Registered Output */ + {22, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 280}}; /* Registered Output */ static pin_fuse_columns pal10l8pinfusecolumns[] = { {1, 3, 2}, @@ -576,7 +645,25 @@ static pin_fuse_columns pal16r8pinfusecolumns[] = { {18, 7, 6}, /* Registered Output */ {19, 3, 2}}; /* Registered Output */ -static pin_fuse_columns gal18v10pinfusecolumns[] = { +static pin_fuse_columns gal16v8pinfusecolumns[] = { + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}}; + +/*static pin_fuse_columns gal18v10pinfusecolumns[] = { {1, 1, 0}, {2, 5, 4}, {3, 9, 8}, @@ -594,7 +681,7 @@ static pin_fuse_columns gal18v10pinfusecolumns[] = { {16, 15, 14}, {17, 11, 10}, {18, 7, 6}, - {19, 3, 2}}; + {19, 3, 2}};*/ static pin_fuse_columns pal20l8pinfusecolumns[] = { {1, 3, 2}, @@ -708,133 +795,137 @@ static pin_fuse_columns pal20r8pinfusecolumns[] = { static pal_data paldata[] = { {"PAL10L8", - pal10l8pinfuserows, - sizeof(pal10l8pinfuserows) / sizeof(pal10l8pinfuserows[0]), - pal10l8pinfusecolumns, - sizeof(pal10l8pinfusecolumns) / sizeof(pal10l8pinfusecolumns[0]), - print_pal10l8_product_terms}, + pal10l8pinfuserows, ARRAY_LEN(pal10l8pinfuserows), + pal10l8pinfusecolumns, ARRAY_LEN(pal10l8pinfusecolumns), + print_pal10l8_product_terms, + config_pal10l8_pins, + NULL}, {"PAL10H8", - pal10h8pinfuserows, - sizeof(pal10h8pinfuserows) / sizeof(pal10h8pinfuserows[0]), - pal10h8pinfusecolumns, - sizeof(pal10h8pinfusecolumns) / sizeof(pal10h8pinfusecolumns[0]), - print_pal10h8_product_terms}, + pal10h8pinfuserows, ARRAY_LEN(pal10h8pinfuserows), + pal10h8pinfusecolumns, ARRAY_LEN(pal10h8pinfusecolumns), + print_pal10h8_product_terms, + config_pal10h8_pins, + NULL}, {"PAL12H6", - pal12h6pinfuserows, - sizeof(pal12h6pinfuserows) / sizeof(pal12h6pinfuserows[0]), - pal12h6pinfusecolumns, - sizeof(pal12h6pinfusecolumns) / sizeof(pal12h6pinfusecolumns[0]), - print_pal12h6_product_terms}, + pal12h6pinfuserows, ARRAY_LEN(pal12h6pinfuserows), + pal12h6pinfusecolumns, ARRAY_LEN(pal12h6pinfusecolumns), + print_pal12h6_product_terms, + config_pal12h6_pins, + NULL}, {"PAL14H4", - pal14h4pinfuserows, - sizeof(pal14h4pinfuserows) / sizeof(pal14h4pinfuserows[0]), - pal14h4pinfusecolumns, - sizeof(pal14h4pinfusecolumns) / sizeof(pal14h4pinfusecolumns[0]), - print_pal14h4_product_terms}, + pal14h4pinfuserows, ARRAY_LEN(pal14h4pinfuserows), + pal14h4pinfusecolumns, ARRAY_LEN(pal14h4pinfusecolumns), + print_pal14h4_product_terms, + config_pal14h4_pins, + NULL}, {"PAL16H2", - pal16h2pinfuserows, - sizeof(pal16h2pinfuserows) / sizeof(pal16h2pinfuserows[0]), - pal16h2pinfusecolumns, - sizeof(pal16h2pinfusecolumns) / sizeof(pal16h2pinfusecolumns[0]), - print_pal16h2_product_terms}, + pal16h2pinfuserows, ARRAY_LEN(pal16h2pinfuserows), + pal16h2pinfusecolumns, ARRAY_LEN(pal16h2pinfusecolumns), + print_pal16h2_product_terms, + config_pal16h2_pins, + NULL}, {"PAL16C1", - pal16c1pinfuserows, - sizeof(pal16c1pinfuserows) / sizeof(pal16c1pinfuserows[0]), - pal16c1pinfusecolumns, - sizeof(pal16c1pinfusecolumns) / sizeof(pal16c1pinfusecolumns[0]), - print_pal16c1_product_terms}, + pal16c1pinfuserows, ARRAY_LEN(pal16c1pinfuserows), + pal16c1pinfusecolumns, ARRAY_LEN(pal16c1pinfusecolumns), + print_pal16c1_product_terms, + config_pal16c1_pins, + NULL}, {"PAL12L6", - pal12l6pinfuserows, - sizeof(pal12l6pinfuserows) / sizeof(pal12l6pinfuserows[0]), - pal12l6pinfusecolumns, - sizeof(pal12l6pinfusecolumns) / sizeof(pal12l6pinfusecolumns[0]), - print_pal12l6_product_terms}, + pal12l6pinfuserows, ARRAY_LEN(pal12l6pinfuserows), + pal12l6pinfusecolumns, ARRAY_LEN(pal12l6pinfusecolumns), + print_pal12l6_product_terms, + config_pal12l6_pins, + NULL}, {"PAL14L4", - pal14l4pinfuserows, - sizeof(pal14l4pinfuserows) / sizeof(pal14l4pinfuserows[0]), - pal14l4pinfusecolumns, - sizeof(pal14l4pinfusecolumns) / sizeof(pal14l4pinfusecolumns[0]), - print_pal14l4_product_terms}, + pal14l4pinfuserows, ARRAY_LEN(pal14l4pinfuserows), + pal14l4pinfusecolumns, ARRAY_LEN(pal14l4pinfusecolumns), + print_pal14l4_product_terms, + config_pal14l4_pins, + NULL}, {"PAL16L2", - pal16l2pinfuserows, - sizeof(pal16l2pinfuserows) / sizeof(pal16l2pinfuserows[0]), - pal16l2pinfusecolumns, - sizeof(pal16l2pinfusecolumns) / sizeof(pal16l2pinfusecolumns[0]), - print_pal16l2_product_terms}, - {"15S8", NULL, 0, NULL, 0, NULL}, - {"PLS153", NULL, 0, NULL, 0, NULL}, + pal16l2pinfuserows, ARRAY_LEN(pal16l2pinfuserows), + pal16l2pinfusecolumns, ARRAY_LEN(pal16l2pinfusecolumns), + print_pal16l2_product_terms, + config_pal16l2_pins, + NULL}, + /*{"15S8", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"PLS153", NULL, 0, NULL, 0, NULL, NULL, NULL},*/ {"PAL16L8", - pal16l8pinfuserows, - sizeof(pal16l8pinfuserows) / sizeof(pal16l8pinfuserows[0]), - pal16l8pinfusecolumns, - sizeof(pal16l8pinfusecolumns) / sizeof(pal16l8pinfusecolumns[0]), - print_pal16l8_product_terms}, + pal16l8pinfuserows, ARRAY_LEN(pal16l8pinfuserows), + pal16l8pinfusecolumns, ARRAY_LEN(pal16l8pinfusecolumns), + print_pal16l8_product_terms, + config_pal16l8_pins, + NULL}, {"PAL16R4", - pal16r4pinfuserows, - sizeof(pal16r4pinfuserows) / sizeof(pal16r4pinfuserows[0]), - pal16r4pinfusecolumns, - sizeof(pal16r4pinfusecolumns) / sizeof(pal16r4pinfusecolumns), - print_pal16r4_product_terms}, + pal16r4pinfuserows, ARRAY_LEN(pal16r4pinfuserows), + pal16r4pinfusecolumns, ARRAY_LEN(pal16r4pinfusecolumns), + print_pal16r4_product_terms, + config_pal16r4_pins, + NULL}, {"PAL16R6", - pal16r6pinfuserows, - sizeof(pal16r6pinfuserows) / sizeof(pal16r6pinfuserows[0]), - pal16r6pinfusecolumns, - sizeof(pal16r6pinfusecolumns) / sizeof(pal16r6pinfusecolumns), - print_pal16r6_product_terms}, + pal16r6pinfuserows, ARRAY_LEN(pal16r6pinfuserows), + pal16r6pinfusecolumns, ARRAY_LEN(pal16r6pinfusecolumns), + print_pal16r6_product_terms, + config_pal16r6_pins, + NULL}, {"PAL16R8", - pal16r8pinfuserows, - sizeof(pal16r8pinfuserows) / sizeof(pal16r8pinfuserows[0]), - pal16r8pinfusecolumns, - sizeof(pal16r8pinfusecolumns) / sizeof(pal16r8pinfusecolumns), - print_pal16r8_product_terms}, - {"PAL16RA8", NULL, 0, NULL, 0, NULL}, - {"PAL16V8R", NULL, 0, NULL, 0, NULL}, - {"PALCE16V8", NULL, 0, NULL, 0, NULL}, - {"GAL16V8A", NULL, 0, NULL, 0, NULL}, - {"18CV8", NULL, 0, NULL, 0, NULL}, + pal16r8pinfuserows, ARRAY_LEN(pal16r8pinfuserows), + pal16r8pinfusecolumns, ARRAY_LEN(pal16r8pinfusecolumns), + print_pal16r8_product_terms, + config_pal16r8_pins, + NULL}, + /*{"PAL16RA8", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"PAL16V8R", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"PALCE16V8", NULL, 0, NULL, 0, NULL, NULL, NULL},*/ + {"GAL16V8", + gal16v8pinfuserows, ARRAY_LEN(gal16v8pinfuserows), + gal16v8pinfusecolumns, ARRAY_LEN(gal16v8pinfusecolumns), + print_gal16v8_product_terms, + config_gal16v8_pins, + is_gal16v8_product_term_enabled}, + /*{"18CV8", NULL, 0, NULL, 0, NULL}, {"GAL18V10", - gal18v10pinfuserows, - sizeof(gal18v10pinfuserows) / sizeof(gal18v10pinfuserows[0]), - gal18v10pinfusecolumns, - sizeof(gal18v10pinfusecolumns) / sizeof(gal18v10pinfusecolumns), - print_gal18v10_product_terms}, + gal18v10pinfuserows, ARRAY_LEN(gal18v10pinfuserows), + gal18v10pinfusecolumns, ARRAY_LEN(gal18v10pinfusecolumns), + print_gal18v10_product_terms, + config_gal18v10_pins, + NULL},*/ {"PAL20L8", - pal20l8pinfuserows, - sizeof(pal20l8pinfuserows) / sizeof(pal20l8pinfuserows[0]), - pal20l8pinfusecolumns, - sizeof(pal20l8pinfusecolumns) / sizeof(pal20l8pinfusecolumns[0]), - print_pal20l8_product_terms}, + pal20l8pinfuserows, ARRAY_LEN(pal20l8pinfuserows), + pal20l8pinfusecolumns, ARRAY_LEN(pal20l8pinfusecolumns), + print_pal20l8_product_terms, + config_pal20l8_pins, + NULL}, {"PAL20L10", - pal20l10pinfuserows, - sizeof(pal20l10pinfuserows) / sizeof(pal20l10pinfuserows[0]), - pal20l10pinfusecolumns, - sizeof(pal20l10pinfusecolumns) / sizeof(pal20l10pinfusecolumns[0]), - print_pal20l10_product_terms}, + pal20l10pinfuserows, ARRAY_LEN(pal20l10pinfuserows), + pal20l10pinfusecolumns, ARRAY_LEN(pal20l10pinfusecolumns), + print_pal20l10_product_terms, + config_pal20l10_pins, + NULL}, {"PAL20R4", - pal20r4pinfuserows, - sizeof(pal20r4pinfuserows) / sizeof(pal20r4pinfuserows[0]), - pal20r4pinfusecolumns, - sizeof(pal20r4pinfusecolumns) / sizeof(pal20r4pinfusecolumns[0]), - print_pal20r4_product_terms}, + pal20r4pinfuserows, ARRAY_LEN(pal20r4pinfuserows), + pal20r4pinfusecolumns, ARRAY_LEN(pal20r4pinfusecolumns), + print_pal20r4_product_terms, + config_pal20r4_pins, + NULL}, {"PAL20R6", - pal20r6pinfuserows, - sizeof(pal20r6pinfuserows) / sizeof(pal20r6pinfuserows[0]), - pal20r6pinfusecolumns, - sizeof(pal20r6pinfusecolumns) / sizeof(pal20r6pinfusecolumns[0]), - print_pal20r6_product_terms}, + pal20r6pinfuserows, ARRAY_LEN(pal20r6pinfuserows), + pal20r6pinfusecolumns, ARRAY_LEN(pal20r6pinfusecolumns), + print_pal20r6_product_terms, + config_pal20r6_pins, + NULL}, {"PAL20R8", - pal20r8pinfuserows, - sizeof(pal20r8pinfuserows) / sizeof(pal20r8pinfuserows[0]), - pal20r8pinfusecolumns, - sizeof(pal20r8pinfusecolumns) / sizeof(pal20r8pinfusecolumns[0]), - print_pal20r8_product_terms}, - {"PAL20X4", NULL, 0, NULL, 0, NULL}, - {"PAL20X8", NULL, 0, NULL, 0, NULL}, - {"PAL20X10", NULL, 0, NULL, 0, NULL}, - {"PAL22V10", NULL, 0, NULL, 0, NULL}, - {"GAL20V8A", NULL, 0, NULL, 0, NULL}, - {"GAL22V10", NULL, 0, NULL, 0, NULL}, - {"PLS100", NULL, 0, NULL, 0, NULL}}; + pal20r8pinfuserows, ARRAY_LEN(pal20r8pinfuserows), + pal20r8pinfusecolumns, ARRAY_LEN(pal20r8pinfusecolumns), + print_pal20r8_product_terms, + config_pal20r8_pins, NULL}/*, + {"PAL20X4", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"PAL20X8", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"PAL20X10", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"PAL22V10", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"GAL20V8A", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"GAL22V10", NULL, 0, NULL, 0, NULL, NULL, NULL}, + {"PLS100", NULL, 0, NULL, 0, NULL, NULL, NULL}*/}; @@ -867,12 +958,11 @@ static int is_jed_file(const char *file) with a pal name -------------------------------------------------*/ -static pal_data* find_pal_data(const char *name) +static const pal_data* find_pal_data(const char *name) { int index; - for (index = 0; index < sizeof(paldata) / sizeof(paldata[0]); - ++index) + for (index = 0; index < ARRAY_LEN(paldata); ++index) { if (!core_stricmp(name, paldata[index].name)) { @@ -886,6 +976,50 @@ static pal_data* find_pal_data(const char *name) /*------------------------------------------------- + find_fuse_rows - finds the fuse row data for + an output pin. +-------------------------------------------------*/ + +static const pin_fuse_rows* find_fuse_rows(const pal_data* pal, UINT16 pin) +{ + UINT16 index; + + for (index = 0; index < pal->pinfuserowscount; ++index) + { + if (pal->pinfuserows[index].pin == pin) + { + return &pal->pinfuserows[index]; + } + } + + return NULL; +} + + + +/*------------------------------------------------- + find_fuse_columns - finds the fuse column + data for an input pin. +-------------------------------------------------*/ + +static const pin_fuse_columns* find_fuse_columns(const pal_data* pal, UINT16 pin) +{ + UINT16 index; + + for (index = 0; index < pal->pinfusecolumnscount; ++index) + { + if (pal->pinfusecolumns[index].pin == pin) + { + return &pal->pinfusecolumns[index]; + } + } + + return NULL; +} + + + +/*------------------------------------------------- calc_fuse_column_count - calculates the total columns of a pal -------------------------------------------------*/ @@ -898,11 +1032,11 @@ static UINT16 calc_fuse_column_count(const pal_data* pal) /*------------------------------------------------- - is_fuse_row_blown - checks if a fuse row is - all blown + all_fuses_in_row_blown - checks if a fuse row + is all blown -------------------------------------------------*/ -static int is_fuse_row_blown(const pal_data* pal, const jed_data* jed, UINT16 fuserow) +static int all_fuses_in_row_blown(const pal_data* pal, const jed_data* jed, UINT16 fuserow) { UINT16 columncount = calc_fuse_column_count(pal); UINT16 column; @@ -921,17 +1055,18 @@ static int is_fuse_row_blown(const pal_data* pal, const jed_data* jed, UINT16 fu /*------------------------------------------------- - is_output_pin - determines if the pin is an - output pin + any_fuses_in_row_blown - checks if any fuses in + a row have been blown. -------------------------------------------------*/ -static int is_output_pin(UINT16 pin) +static int any_fuses_in_row_blown(const pal_data* pal, const jed_data* jed, UINT16 fuserow) { - UINT16 index; + UINT16 columncount = calc_fuse_column_count(pal); + UINT16 column; - for (index = 0; index < outputpinscount; ++index) + for (column = 0; column < columncount; ++column) { - if (outputpins[index] == pin) + if (jed_get_fuse(jed, fuserow + column)) { return 1; } @@ -943,88 +1078,79 @@ static int is_output_pin(UINT16 pin) /*------------------------------------------------- - find_input_pins - finds the input pins of a - pal + set_input_pins - saves the pins that can be + used by a product term -------------------------------------------------*/ -static void find_input_pins(const pal_data* pal, const jed_data* jed) +static void set_input_pins(const UINT16* pins, UINT16 pin_count) { - UINT16 column; - - inputpinscount = 0; + UINT16 index; - for (column = 0; column < pal->pinfusecolumnscount; ++column) + for (index = 0; index < pin_count; ++index) { - if (!is_output_pin(pal->pinfusecolumns[column].pin)) - { - inputpins[inputpinscount] = pal->pinfusecolumns[column].pin; + inputpins[index] = pins[index]; - ++inputpinscount; - } + ++inputpinscount; } } /*------------------------------------------------- - find_output_pins - finds the output pins of a - pal + set_output_pins - saves the output pins -------------------------------------------------*/ -static void find_output_pins(const pal_data* pal, const jed_data* jed) +static void set_output_pins(const pin_output_config* pin_output_configs, UINT16 pin_count) { - UINT16 column, columncount, index; - int fuseblown; - - outputpinscount = 0; - columncount = calc_fuse_column_count(pal); + UINT16 index; - for (index = 0; index < pal->pinfuserowscount; ++index) + for (index = 0; index < pin_count; ++index) { - fuseblown = 0; + outputpins[index].pin = pin_output_configs[index].pin; + outputpins[index].flags = pin_output_configs[index].flags; - if (pal->pinfuserows[index].fuserowoutputenable == CNoOutputEnableFuseRow) - { - fuseblown = 1; - } - else - { - for (column = 0; column < columncount; ++column) - { - if (jed_get_fuse(jed, pal->pinfuserows[index].fuserowoutputenable + column) == 1) - { - fuseblown = 1; - } - } - } + ++outputpinscount; + } +} - if (fuseblown) - { - outputpins[outputpinscount] = pal->pinfuserows[index].pin; - ++outputpinscount; + +/*------------------------------------------------- + is_output_pin - determines if the pin is an + output pin +-------------------------------------------------*/ + +static int is_output_pin(UINT16 pin) +{ + UINT16 index; + + for (index = 0; index < outputpinscount; ++index) + { + if (outputpins[index].pin == pin) + { + return 1; } } + + return 0; } -static int is_output_pin_used(const pal_data* pal, const jed_data* jed, const pin_fuse_rows* fuse_rows) -{ - UINT16 row, column, columncount; +/*------------------------------------------------- + get_pin_output_flags - gets the flags + of an output pin +-------------------------------------------------*/ - columncount = calc_fuse_column_count(pal); +static UINT16 get_pin_output_flags(UINT16 pin) +{ + UINT16 index; - for (row = fuse_rows->fuserowtermstart; - row <= fuse_rows->fuserowtermend; - row += columncount) + for (index = 0; index < outputpinscount; ++index) { - for (column = 0; column < columncount; ++column) + if (outputpins[index].pin == pin) { - if (jed_get_fuse(jed, row + column)) - { - return 1; - } + return outputpins[index].flags; } } @@ -1034,59 +1160,123 @@ static int is_output_pin_used(const pal_data* pal, const jed_data* jed, const pi /*------------------------------------------------- - generate_product_terms - prints the product terms - for a fuse row + get_pin_fuse_state - gets the fuse state of + an input pin +-------------------------------------------------*/ + +static UINT16 get_pin_fuse_state(const pal_data* pal, const jed_data* jed, UINT16 pin, UINT16 fuserow) +{ + const pin_fuse_columns* fuse_columns = find_fuse_columns(pal, pin); + int lowfusestate, highfusestate; + + if (!fuse_columns) + { + fprintf(stderr, "Fuse column data missing for pin %d!\n", pin); + + return NO_FUSE_BLOWN; + } + + lowfusestate = jed_get_fuse(jed, fuserow + fuse_columns->lowfusecolumn); + highfusestate = jed_get_fuse(jed, fuserow + fuse_columns->highfusecolumn); + + if (!lowfusestate && highfusestate) + { + return LOW_FUSE_BLOWN; + } + else if (lowfusestate && !highfusestate) + { + return HIGH_FUSE_BLOWN; + } + else if (!lowfusestate && !highfusestate) + { + return NO_FUSE_BLOWN; + } + + return LOWHIGH_FUSE_BLOWN; +} + + + +/*------------------------------------------------- + generate_product_terms - prints the product + terms for a fuse row -------------------------------------------------*/ static void generate_product_terms(const pal_data* pal, const jed_data* jed, UINT16 fuserow, char* buffer) { - UINT16 index; - int lowfusestate, highfusestate, haveterm; + UINT16 index, pin, fuse_state, haveterm, flags; char tmpbuffer[20]; *buffer = 0; haveterm = 0; - for (index = 0; index < pal->pinfusecolumnscount; ++index) + if (pal->is_product_term_enabled && !pal->is_product_term_enabled(pal, jed, fuserow)) { - lowfusestate = jed_get_fuse(jed, fuserow + pal->pinfusecolumns[index].lowfusecolumn); - highfusestate = jed_get_fuse(jed, fuserow + pal->pinfusecolumns[index].highfusecolumn); + return; + } + + for (index = 0; index < inputpinscount; ++index) + { + pin = inputpins[index]; - if (!lowfusestate && highfusestate) + fuse_state = get_pin_fuse_state(pal, jed, pin, fuserow); + + if (fuse_state == LOW_FUSE_BLOWN) { if (haveterm) { strcat(buffer, " & "); } - if (!is_output_pin(pal->pinfusecolumns[index].pin)) + if (!is_output_pin(pin)) { - sprintf(tmpbuffer, "/i%d", pal->pinfusecolumns[index].pin); + sprintf(tmpbuffer, "/i%d", pin); strcat(buffer, tmpbuffer); } else { - sprintf(tmpbuffer, "/o%d", pal->pinfusecolumns[index].pin); + flags = get_pin_output_flags(pin); + + if (flags & OUTPUT_COMBINATORIAL) + { + sprintf(tmpbuffer, "/o%d", pin); + } + else if (flags & OUTPUT_REGISTERED) + { + sprintf(tmpbuffer, "/rf%d", pin); + } + strcat(buffer, tmpbuffer); } haveterm = 1; } - else if (lowfusestate && !highfusestate) + + if (fuse_state == HIGH_FUSE_BLOWN) { if (haveterm) { strcat(buffer, " & "); } - if (!is_output_pin(pal->pinfusecolumns[index].pin)) + if (!is_output_pin(pin)) { - sprintf(tmpbuffer, "i%d", pal->pinfusecolumns[index].pin); + sprintf(tmpbuffer, "i%d", pin); strcat(buffer, tmpbuffer); } else { - sprintf(tmpbuffer, "o%d", pal->pinfusecolumns[index].pin); + flags = get_pin_output_flags(pin); + + if (flags & OUTPUT_COMBINATORIAL) + { + sprintf(tmpbuffer, "o%d", pin); + } + else if (flags & OUTPUT_REGISTERED) + { + sprintf(tmpbuffer, "rf%d", pin); + } + strcat(buffer, tmpbuffer); } @@ -1102,84 +1292,109 @@ static void generate_product_terms(const pal_data* pal, const jed_data* jed, UIN for a pal -------------------------------------------------*/ -static void print_product_terms(const pal_data* pal, const jed_data* jed, int activestate) +static void print_product_terms(const pal_data* pal, const jed_data* jed) { - UINT16 index, row, columncount; + UINT16 index, columncount, flags, row, haveterms; char buffer[200]; - int haveterms, indent, indentindex; + int indent, indentindex; + const pin_fuse_rows* fuse_rows; columncount = calc_fuse_column_count(pal); - for (index = 0; index < pal->pinfuserowscount; ++index) + for (index = 0; index < outputpinscount; ++index) { - if (is_output_pin(pal->pinfuserows[index].pin) && - is_output_pin_used(pal, jed, &pal->pinfuserows[index])) + flags = outputpins[index].flags; + + indent = 0; + + if (flags & OUTPUT_ACTIVELOW) { - indent = 0; + printf("/"); - if (!activestate) - { - printf("/"); + ++indent; + } - ++indent; - } + if (flags & OUTPUT_COMBINATORIAL) + { + sprintf(buffer, "o%d = ", outputpins[index].pin); + } + else if (flags & OUTPUT_REGISTERED) + { + sprintf(buffer, "rf%d := ", outputpins[index].pin); + } + else + { + fprintf(stderr, "Unknown output type for pin %d!\n", outputpins[index].pin); - sprintf(buffer, "o%d = ", pal->pinfuserows[index].pin); + continue; + } - printf("%s", buffer); + printf("%s", buffer); - haveterms = 0; - indent += strlen(buffer); + haveterms = 0; + indent += strlen(buffer); - for (row = pal->pinfuserows[index].fuserowtermstart; - row <= pal->pinfuserows[index].fuserowtermend; - row += columncount) - { - generate_product_terms(pal, jed, row, buffer); + fuse_rows = find_fuse_rows(pal, outputpins[index].pin); - if (strlen(buffer) > 0) + if (!fuse_rows) + { + fprintf(stderr, "Fuse row data missing!\n"); + + continue; + } + + for (row = fuse_rows->fuserowtermstart; row <= fuse_rows->fuserowtermend; + row += columncount) + { + generate_product_terms(pal, jed, row, buffer); + + if (strlen(buffer) > 0) + { + if (haveterms) { - if (haveterms) - { - printf(" +\n"); + printf(" +\n"); - for (indentindex = 0; indentindex < indent; ++indentindex) - { - printf(" "); - } - } - else + for (indentindex = 0; indentindex < indent; ++indentindex) { - haveterms = 1; + printf(" "); } - - printf("%s", buffer); } + else + { + haveterms = 1; + } + + printf("%s", buffer); } + } - printf("\n"); + printf("\n"); - /* output enable equations */ + /* output enable equations */ - printf("o%d.oe = ", pal->pinfuserows[index].pin); + if (flags & OUTPUT_COMBINATORIAL) + { + printf("o%d.oe = ", outputpins[index].pin); - if (pal->pinfuserows[index].fuserowoutputenable == CNoOutputEnableFuseRow || - is_fuse_row_blown(pal, jed, pal->pinfuserows[index].fuserowoutputenable)) + if (fuse_rows->fuserowoutputenable == NO_OUTPUT_ENABLE_FUSE_ROW || + all_fuses_in_row_blown(pal, jed, fuse_rows->fuserowoutputenable)) { printf("vcc\n"); } else { - generate_product_terms(pal, jed, pal->pinfuserows[index].fuserowoutputenable, buffer); + generate_product_terms(pal, jed, fuse_rows->fuserowoutputenable, buffer); printf("%s\n", buffer); } - - printf("\n"); } - } + else if (flags & OUTPUT_REGISTERED) + { + printf("rf%d.oe = OE\n", outputpins[index].pin); + } - printf("\n"); + printf("\n"); + } } @@ -1191,7 +1406,7 @@ static void print_product_terms(const pal_data* pal, const jed_data* jed, int ac static void print_pal10l8_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 0); + print_product_terms(pal, jed); } @@ -1203,7 +1418,7 @@ static void print_pal10l8_product_terms(const pal_data* pal, const jed_data* jed static void print_pal10h8_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 1); + print_product_terms(pal, jed); } @@ -1215,7 +1430,7 @@ static void print_pal10h8_product_terms(const pal_data* pal, const jed_data* jed static void print_pal12l6_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 0); + print_product_terms(pal, jed); } @@ -1227,7 +1442,7 @@ static void print_pal12l6_product_terms(const pal_data* pal, const jed_data* jed static void print_pal12h6_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 1); + print_product_terms(pal, jed); } @@ -1239,7 +1454,7 @@ static void print_pal12h6_product_terms(const pal_data* pal, const jed_data* jed static void print_pal14l4_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 0); + print_product_terms(pal, jed); } @@ -1251,7 +1466,7 @@ static void print_pal14l4_product_terms(const pal_data* pal, const jed_data* jed static void print_pal14h4_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 1); + print_product_terms(pal, jed); } @@ -1263,7 +1478,7 @@ static void print_pal14h4_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16l2_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 0); + print_product_terms(pal, jed); } @@ -1275,7 +1490,7 @@ static void print_pal16l2_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16h2_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 1); + print_product_terms(pal, jed); } @@ -1287,7 +1502,7 @@ static void print_pal16h2_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16c1_product_terms(const pal_data* pal, const jed_data* jed) { - printf("Viewing product terms are not supported.\n"); + print_product_terms(pal, jed); } @@ -1299,7 +1514,7 @@ static void print_pal16c1_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16l8_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 0); + print_product_terms(pal, jed); } @@ -1311,7 +1526,7 @@ static void print_pal16l8_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16r4_product_terms(const pal_data* pal, const jed_data* jed) { - printf("Viewing product terms are not supported.\n"); + print_product_terms(pal, jed); } @@ -1323,7 +1538,7 @@ static void print_pal16r4_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16r6_product_terms(const pal_data* pal, const jed_data* jed) { - printf("Viewing product terms are not supported.\n"); + print_product_terms(pal, jed); } @@ -1335,7 +1550,19 @@ static void print_pal16r6_product_terms(const pal_data* pal, const jed_data* jed static void print_pal16r8_product_terms(const pal_data* pal, const jed_data* jed) { - printf("Viewing product terms are not supported.\n"); + print_product_terms(pal, jed); +} + + + +/*------------------------------------------------- + print_gal16v8_product_terms - prints the product + terms for a GAL16V8 +-------------------------------------------------*/ + +static void print_gal16v8_product_terms(const pal_data* pal, const jed_data* jed) +{ + print_product_terms(pal, jed); } @@ -1345,10 +1572,10 @@ static void print_pal16r8_product_terms(const pal_data* pal, const jed_data* jed terms for a GAL18V10 -------------------------------------------------*/ -static void print_gal18v10_product_terms(const pal_data* pal, const jed_data* jed) +/*static void print_gal18v10_product_terms(const pal_data* pal, const jed_data* jed) { printf("Viewing product terms are not supported.\n"); -} +}*/ @@ -1359,7 +1586,7 @@ static void print_gal18v10_product_terms(const pal_data* pal, const jed_data* je static void print_pal20l8_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 0); + print_product_terms(pal, jed); } @@ -1371,7 +1598,7 @@ static void print_pal20l8_product_terms(const pal_data* pal, const jed_data* jed static void print_pal20l10_product_terms(const pal_data* pal, const jed_data* jed) { - print_product_terms(pal, jed, 0); + print_product_terms(pal, jed); } @@ -1383,7 +1610,7 @@ static void print_pal20l10_product_terms(const pal_data* pal, const jed_data* je static void print_pal20r4_product_terms(const pal_data* pal, const jed_data* jed) { - printf("Viewing product terms are not supported.\n"); + print_product_terms(pal, jed); } @@ -1395,7 +1622,7 @@ static void print_pal20r4_product_terms(const pal_data* pal, const jed_data* jed static void print_pal20r6_product_terms(const pal_data* pal, const jed_data* jed) { - printf("Viewing product terms are not supported.\n"); + print_product_terms(pal, jed); } @@ -1407,7 +1634,818 @@ static void print_pal20r6_product_terms(const pal_data* pal, const jed_data* jed static void print_pal20r8_product_terms(const pal_data* pal, const jed_data* jed) { - printf("Viewing product terms are not supported.\n"); + print_product_terms(pal, jed); +} + + + +/*------------------------------------------------- + config_pal10l8_pins - configures the pins for + a PAL10L8 +-------------------------------------------------*/ + +static void config_pal10l8_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11}; + static pin_output_config output_pins[] = { + {12, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {13, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {14, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {15, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {17, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {18, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {19, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal10h8_pins - configures the pins for + a PAL10H8 +-------------------------------------------------*/ + +static void config_pal10h8_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11}; + static pin_output_config output_pins[] = { + {12, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {13, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {14, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {15, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {17, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {18, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {19, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal12l6_pins - configures the pins for + a PAL12L6 +-------------------------------------------------*/ + +static void config_pal12l6_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 19}; + static pin_output_config output_pins[] = { + {13, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {14, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {15, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {17, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {18, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal12h6_pins - configures the pins for + a PAL12H6 +-------------------------------------------------*/ + +static void config_pal12h6_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 19}; + static pin_output_config output_pins[] = { + {13, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {14, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {15, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {17, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {18, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal14l4_pins - configures the pins for + a PAL14L4 +-------------------------------------------------*/ + +static void config_pal14l4_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 18, 19}; + static pin_output_config output_pins[] = { + {14, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {15, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {17, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal14h4_pins - configures the pins for + a PAL14H4 +-------------------------------------------------*/ + +static void config_pal14h4_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 18, 19}; + static pin_output_config output_pins[] = { + {14, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {15, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {17, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal16l2_pins - configures the pins for + a PAL16L2 +-------------------------------------------------*/ + +static void config_pal16l2_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 17, 18, 19}; + static pin_output_config output_pins[] = { + {15, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal16h2_pins - configures the pins for + a PAL16H2 +-------------------------------------------------*/ + +static void config_pal16h2_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 17, 18, 19}; + static pin_output_config output_pins[] = { + {15, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal16c1_pins - configures the pins for + a PAL16C1 +-------------------------------------------------*/ + +static void config_pal16c1_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 17, 18, 19}; + static pin_output_config output_pins[] = { + {15, OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL}, + {16, OUTPUT_ACTIVEHIGH | OUTPUT_COMBINATORIAL}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_pal16l8_pins - configures the pins for + a PAL16L8 +-------------------------------------------------*/ + +static void config_pal16l8_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18}; + pin_output_config output_pins[8]; + UINT16 output_pin_count, index; + + output_pin_count = 0; + + for (index = 0; index < pal->pinfuserowscount; ++index) + { + if (any_fuses_in_row_blown(pal, jed, pal->pinfuserows[index].fuserowoutputenable)) + { + output_pins[output_pin_count].pin = pal->pinfuserows[index].pin; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + } + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_pal16r4_pins - configures the pins for + a PAL16R4 +-------------------------------------------------*/ + +static void config_pal16r4_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19}; + static UINT16 registered_pins[] = {14, 15, 16, 17}; + pin_output_config output_pins[8]; + UINT16 output_pin_count, index; + + output_pin_count = 0; + + if (any_fuses_in_row_blown(pal, jed, 1792)) + { + output_pins[output_pin_count].pin = 12; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 1536)) + { + output_pins[output_pin_count].pin = 13; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + for (index = 0; index < ARRAY_LEN(registered_pins); ++index) + { + output_pins[output_pin_count].pin = registered_pins[index]; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_REGISTERED; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 256)) + { + output_pins[output_pin_count].pin = 18; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 0)) + { + output_pins[output_pin_count].pin = 19; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_pal16r6_pins - configures the pins + for a PAL16R6 +-------------------------------------------------*/ + +static void config_pal16r6_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19}; + static UINT16 registered_pins[] = {13, 14, 15, 16, 17, 18}; + pin_output_config output_pins[8]; + UINT16 output_pin_count, index; + + output_pin_count = 0; + + if (any_fuses_in_row_blown(pal, jed, 1792)) + { + output_pins[output_pin_count].pin = 12; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + for (index = 0; index < ARRAY_LEN(registered_pins); ++index) + { + output_pins[output_pin_count].pin = registered_pins[index]; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_REGISTERED; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 0)) + { + output_pins[output_pin_count].pin = 19; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_pal16r8_pins - configures the pins for + a PAL16R8 +-------------------------------------------------*/ + +static void config_pal16r8_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19}; + static pin_output_config output_pins[] = { + {12, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {13, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {14, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {15, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {16, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {17, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {18, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {19, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + config_gal16v8_pins - configures the pins for + a GAL16V8 +-------------------------------------------------*/ + +static void config_gal16v8_pins(const pal_data* pal, const jed_data* jed) +{ + typedef struct _output_logic_macrocell output_logic_macrocell; + struct _output_logic_macrocell + { + UINT16 pin; + UINT16 xor_fuse; + UINT16 ac1_fuse; + }; + + static output_logic_macrocell macrocells[] = { + {12, 2055, 2127}, + {13, 2054, 2126}, + {14, 2053, 2125}, + {15, 2052, 2124}, + {16, 2051, 2123}, + {17, 2050, 2122}, + {18, 2049, 2121}, + {19, 2048, 2120}}; + static pin_fuse_rows pinfuserows_registered[] = { + {12, NO_OUTPUT_ENABLE_FUSE_ROW, 1792, 2016}, + {13, NO_OUTPUT_ENABLE_FUSE_ROW, 1536, 1760}, + {14, NO_OUTPUT_ENABLE_FUSE_ROW, 1280, 1504}, + {15, NO_OUTPUT_ENABLE_FUSE_ROW, 1024, 1248}, + {16, NO_OUTPUT_ENABLE_FUSE_ROW, 768, 992}, + {17, NO_OUTPUT_ENABLE_FUSE_ROW, 512, 736}, + {18, NO_OUTPUT_ENABLE_FUSE_ROW, 256, 480}, + {19, NO_OUTPUT_ENABLE_FUSE_ROW, 0, 224}}; + static pin_fuse_rows pinfuserows_combinatorial[] = { + {12, 1792, 1824, 2016}, + {13, 1536, 1568, 1760}, + {14, 1280, 1312, 1504}, + {15, 1024, 1056, 1248}, + {16, 768, 800, 992}, + {17, 512, 544, 736}, + {18, 256, 288, 480}, + {19, 0, 32, 224}}; + static pin_fuse_columns pinfusecolumns_registered[] = { + {2, 1, 0}, + {3, 5, 4}, + {4, 9, 8}, + {5, 13, 12}, + {6, 17, 16}, + {7, 21, 20}, + {8, 25, 24}, + {9, 29, 28}, + {12, 31, 30}, + {13, 27, 26}, + {14, 23, 22}, + {15, 19, 18}, + {16, 15, 14}, + {17, 11, 10}, + {18, 7, 6}, + {19, 3, 2}}; + static pin_fuse_columns pinfusecolumns_combinatorialcomplex[] = { + {1, 3, 2}, + {2, 1, 0}, + {3, 5, 4}, + {4, 9, 8}, + {5, 13, 12}, + {6, 17, 16}, + {7, 21, 20}, + {8, 25, 24}, + {9, 29, 28}, + {11, 31, 30}, + {13, 27, 26}, + {14, 23, 22}, + {15, 19, 18}, + {16, 15, 14}, + {17, 11, 10}, + {18, 7, 6}}; + static pin_fuse_columns pinfusecolumns_combinatorialsimple[] = { + {1, 3, 2}, + {2, 1, 0}, + {3, 5, 4}, + {4, 9, 8}, + {5, 13, 12}, + {6, 17, 16}, + {7, 21, 20}, + {8, 25, 24}, + {9, 29, 28}, + {11, 31, 30}, + {12, 27, 26}, + {13, 23, 22}, + {14, 19, 18}, + {17, 15, 14}, + {18, 11, 10}, + {19, 7, 6}}; + static UINT16 input_pins_registered[] = {2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19}; + static UINT16 input_pins_combinatorialcomplex[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18}; + static UINT16 input_pins_combinatorialsimple[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 17, 18, 19}; + pin_output_config output_pins[ARRAY_LEN(macrocells)]; + UINT16 index, output_pin_count; + + output_pin_count = 0; + + /* SYN Fuse: 0 - registered, 1 - combinatorial */ + + if (jed_get_fuse(jed, 2192)) + { + /* Combinatorial */ + /* AC0 Fuse: 0 - simple mode, 1 - complex mode */ + + if (jed_get_fuse(jed, 2193)) + { + /* Complex Mode */ + + set_input_pins(input_pins_combinatorialcomplex, ARRAY_LEN(input_pins_combinatorialcomplex)); + + memcpy(gal16v8pinfuserows, pinfuserows_combinatorial, sizeof(pinfuserows_combinatorial)); + memcpy(gal16v8pinfusecolumns, pinfusecolumns_combinatorialcomplex, sizeof(pinfusecolumns_combinatorialcomplex)); + + for (index = 0; index < ARRAY_LEN(macrocells); ++index) + { + if (is_gal16v8_product_term_enabled(pal, jed, pal->pinfuserows[index].fuserowoutputenable) && + any_fuses_in_row_blown(pal, jed, pal->pinfuserows[index].fuserowoutputenable)) + { + output_pins[output_pin_count].pin = macrocells[index].pin; + output_pins[output_pin_count].flags = OUTPUT_COMBINATORIAL; + + if (jed_get_fuse(jed, macrocells[index].xor_fuse)) + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVEHIGH; + } + else + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVELOW; + } + + ++output_pin_count; + } + } + } + else + { + /* Simple Mode */ + + set_input_pins(input_pins_combinatorialsimple, ARRAY_LEN(input_pins_combinatorialsimple)); + + memcpy(gal16v8pinfuserows, pinfuserows_registered, sizeof(pinfuserows_registered)); + memcpy(gal16v8pinfusecolumns, pinfusecolumns_combinatorialsimple, sizeof(pinfusecolumns_combinatorialsimple)); + + for (index = 0; index < ARRAY_LEN(macrocells); ++index) + { + if (jed_get_fuse(jed, macrocells[index].ac1_fuse)) + { + /* Pin is for input only */ + + if (macrocells[index].pin == 15 || macrocells[index].pin == 16) + { + fprintf(stderr, "Pin %d cannot be configured as an input pin.\n", + macrocells[index].pin); + } + } + else + { + output_pins[output_pin_count].pin = macrocells[index].pin; + output_pins[output_pin_count].flags = OUTPUT_COMBINATORIAL; + + if (jed_get_fuse(jed, macrocells[index].xor_fuse)) + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVEHIGH; + } + else + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVELOW; + } + + ++output_pin_count; + } + } + } + } + else + { + /* Registered */ + + set_input_pins(input_pins_registered, ARRAY_LEN(input_pins_registered)); + + memcpy(gal16v8pinfusecolumns, pinfusecolumns_registered, sizeof(pinfusecolumns_registered)); + + for (index = 0; index < ARRAY_LEN(macrocells); ++index) + { + if (jed_get_fuse(jed, macrocells[index].ac1_fuse)) + { + /* combinatorial pin */ + + gal16v8pinfuserows[index].fuserowoutputenable = pinfuserows_combinatorial[index].fuserowoutputenable; + gal16v8pinfuserows[index].fuserowtermstart = pinfuserows_combinatorial[index].fuserowtermstart; + gal16v8pinfuserows[index].fuserowtermend = pinfuserows_combinatorial[index].fuserowtermend; + + if (is_gal16v8_product_term_enabled(pal, jed, pal->pinfuserows[index].fuserowoutputenable) && + any_fuses_in_row_blown(pal, jed, pal->pinfuserows[index].fuserowoutputenable)) + { + output_pins[output_pin_count].pin = macrocells[index].pin; + output_pins[output_pin_count].flags = OUTPUT_COMBINATORIAL; + + if (jed_get_fuse(jed, macrocells[index].xor_fuse)) + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVEHIGH; + } + else + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVELOW; + } + + ++output_pin_count; + } + } + else + { + /* registered pin */ + + gal16v8pinfuserows[index].fuserowoutputenable = pinfuserows_registered[index].fuserowoutputenable; + gal16v8pinfuserows[index].fuserowtermstart = pinfuserows_registered[index].fuserowtermstart; + gal16v8pinfuserows[index].fuserowtermend = pinfuserows_registered[index].fuserowtermend; + + output_pins[output_pin_count].pin = macrocells[index].pin; + output_pins[output_pin_count].flags = OUTPUT_REGISTERED; + + if (jed_get_fuse(jed, macrocells[index].xor_fuse)) + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVEHIGH; + } + else + { + output_pins[output_pin_count].flags |= OUTPUT_ACTIVELOW; + } + + ++output_pin_count; + } + } + } + + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_gal18v10_pins - configures the pins + for a GAL18V10 +-------------------------------------------------*/ + +/*static void config_gal18v10_pins(const pal_data* pal, const jed_data* jed) +{ +}*/ + + + +/*------------------------------------------------- + config_pal20l8_pins - configures the pins for + a PAL20L8 +-------------------------------------------------*/ + +static void config_pal20l8_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 16, 17, 18, 19, 20, 21, 23}; + pin_output_config output_pins[8]; + UINT16 output_pin_count, index; + + output_pin_count = 0; + + for (index = 0; index < pal->pinfuserowscount; ++index) + { + if (any_fuses_in_row_blown(pal, jed, pal->pinfuserows[index].fuserowoutputenable)) + { + output_pins[output_pin_count].pin = pal->pinfuserows[index].pin; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + } + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_pal20l10_pins - configures the pins for + a PAL20L10 +-------------------------------------------------*/ + +static void config_pal20l10_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 17, 18, 19, 20, 21, 22}; + pin_output_config output_pins[10]; + UINT16 output_pin_count, index; + + output_pin_count = 0; + + for (index = 0; index < pal->pinfuserowscount; ++index) + { + if (any_fuses_in_row_blown(pal, jed, pal->pinfuserows[index].fuserowoutputenable)) + { + output_pins[output_pin_count].pin = pal->pinfuserows[index].pin; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + } + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_pal20r4_pins - configures the pins for + a PAL20R4 +-------------------------------------------------*/ + +static void config_pal20r4_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}; + static UINT16 registered_pins[] = {17, 18, 19, 20}; + pin_output_config output_pins[8]; + UINT16 output_pin_count, index; + + output_pin_count = 0; + + if (any_fuses_in_row_blown(pal, jed, 2240)) + { + output_pins[output_pin_count].pin = 15; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 1920)) + { + output_pins[output_pin_count].pin = 16; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + for (index = 0; index < ARRAY_LEN(registered_pins); ++index) + { + output_pins[output_pin_count].pin = registered_pins[index]; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_REGISTERED; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 320)) + { + output_pins[output_pin_count].pin = 21; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 0)) + { + output_pins[output_pin_count].pin = 22; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_pal20r6_pins - configures the pins for + a PAL20R6 +-------------------------------------------------*/ + +static void config_pal20r6_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}; + static UINT16 registered_pins[] = {16, 17, 18, 19, 20, 21}; + pin_output_config output_pins[8]; + UINT16 output_pin_count, index; + + output_pin_count = 0; + + if (any_fuses_in_row_blown(pal, jed, 2240)) + { + output_pins[output_pin_count].pin = 15; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + for (index = 0; index < ARRAY_LEN(registered_pins); ++index) + { + output_pins[output_pin_count].pin = registered_pins[index]; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_REGISTERED; + + ++output_pin_count; + } + + if (any_fuses_in_row_blown(pal, jed, 0)) + { + output_pins[output_pin_count].pin = 22; + output_pins[output_pin_count].flags = OUTPUT_ACTIVELOW | OUTPUT_COMBINATORIAL; + + ++output_pin_count; + } + + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, output_pin_count); +} + + + +/*------------------------------------------------- + config_pal20r8_pins - configures the pins for + a PAL20R8 +-------------------------------------------------*/ + +static void config_pal20r8_pins(const pal_data* pal, const jed_data* jed) +{ + static UINT16 input_pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}; + static pin_output_config output_pins[] = { + {15, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {16, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {17, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {18, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {19, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {20, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {21, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}, + {22, OUTPUT_ACTIVELOW | OUTPUT_REGISTERED}}; + + set_input_pins(input_pins, ARRAY_LEN(input_pins)); + set_output_pins(output_pins, ARRAY_LEN(output_pins)); +} + + + +/*------------------------------------------------- + is_gal16v8_product_term_enabled - determins if + a fuse row in a GAL16V8 is enabled +-------------------------------------------------*/ + +static int is_gal16v8_product_term_enabled(const pal_data* pal, const jed_data* jed, UINT16 fuserow) +{ + UINT16 fuse_ptd; + + fuse_ptd = (fuserow / calc_fuse_column_count(pal)) + 2128; + + if (fuse_ptd > 2191) + { + fprintf(stderr, "Fuse row %d is illegal!\n", fuserow); + + return 0; + } + + return jed_get_fuse(jed, fuse_ptd); } @@ -1506,6 +2544,7 @@ static int print_usage() " jedutil -convert <source.bin> <target.jed> -- convert binary to JED form\n" " jedutil -view <source.jed> <pal name> -- dump JED logic equations\n" " jedutil -view <source.bin> <pal name> -- dump binary logic equations\n" + " jedutil -viewlist -- view list of supported devices\n" ); return 0; @@ -1639,7 +2678,7 @@ static int command_view(int argc, char *argv[]) { const char *srcfile, *palname; int is_jed; - pal_data* pal; + const pal_data* pal; jed_data jed; int err; @@ -1692,8 +2731,7 @@ static int command_view(int argc, char *argv[]) /* generate equations from fuse map */ - find_output_pins(pal, &jed); - find_input_pins(pal, &jed); + pal->config_pins(pal, &jed); if (pal->print_product_terms) { @@ -1712,23 +2750,46 @@ static int command_view(int argc, char *argv[]) /*------------------------------------------------- + command_viewlist - views the list of supported + jeds +-------------------------------------------------*/ + +static int command_viewlist(int argc, char *argv[]) +{ + int index; + + if (argc > 0) + { + return print_usage(); + } + + for (index = 0; index < ARRAY_LEN(paldata); ++index) + { + printf("%s\n", paldata[index].name); + } + + return 0; +} + + +/*------------------------------------------------- main - primary entry point -------------------------------------------------*/ int main(int argc, char *argv[]) { command_entry command_entries[] = { - {"-convert", &command_convert}, - {"-view", &command_view}}; + {"-convert", &command_convert}, + {"-view", &command_view}, + {"-viewlist", &command_viewlist}}; int index; - /* needs at least two arguments */ - if (argc < 4) + if (argc < 2) { return print_usage(); } - for (index = 0; index < sizeof(command_entries) / sizeof(command_entries[0]); ++index) + for (index = 0; index < ARRAY_LEN(command_entries); ++index) { if (!strcmp(argv[1], command_entries[index].command)) return command_entries[index].command_func(argc - 2, &argv[2]); |
