| /* Subroutines used for reading MCU data on TI MSP430 processors. |
| Copyright (C) 2019-2022 Free Software Foundation, Inc. |
| Contributed by Jozef Lawrynowicz <jozef.l@mittosystems.com>. |
| |
| This file is part of GCC. |
| |
| GCC is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3, or (at your option) |
| any later version. |
| |
| GCC is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GCC; see the file COPYING3. If not see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include "config.h" |
| #include "system.h" |
| #include "coretypes.h" |
| #include "backend.h" |
| #include "target.h" |
| #include "tree.h" |
| #include "memmodel.h" |
| #include "diagnostic-core.h" |
| #include "langhooks.h" |
| #include "builtins.h" |
| #include "intl.h" |
| #include "msp430-devices.h" |
| |
| struct t_msp430_mcu_data extracted_mcu_data; |
| /* Initialized at the bottom of this file. */ |
| extern struct t_msp430_mcu_data hard_msp430_mcu_data[605]; |
| |
| /* Set to the full path to devices.csv if it is found by searching the -I and |
| -L paths. */ |
| char *derived_devices_csv_loc = NULL; |
| |
| /* This is to canonicalize the directory separators in the path. |
| On Windows we could have a mix of '/' and '\' in the path. */ |
| static void |
| canonicalize_path_dirsep (char **path) |
| { |
| char *t_path = *path; |
| int len = strlen (t_path); |
| int i; |
| for (i = 0; i < len; i++) |
| if (IS_DIR_SEPARATOR (t_path[i])) |
| t_path[i] = DIR_SEPARATOR; |
| } |
| |
| /* This function returns the enclosing directory of PATH. |
| It is inconsequential whether PATH ends in a dirsep or not. |
| It modifies the string pointed to by PATH. */ |
| char * |
| msp430_dirname (char *path) |
| { |
| int last_elem = strlen (path) - 1; |
| int i = last_elem - (IS_DIR_SEPARATOR (path[last_elem]) ? 1 : 0); |
| for (; i >= 0; i--) |
| { |
| if (IS_DIR_SEPARATOR (path[i])) |
| { |
| path[i] = '\0'; |
| return path; |
| } |
| } |
| return path; |
| } |
| |
| /* We need to support both the msp430-elf and msp430-elfbare target aliases. |
| gcc/config/msp430/t-msp430 will define TARGET_SUBDIR to the target_subdir |
| Makefile variable, which will evaluate to the correct subdirectory that |
| needs to be searched for devices.csv. */ |
| #ifndef TARGET_SUBDIR |
| #define TARGET_SUBDIR msp430-elf |
| #endif |
| |
| #define _MSPMKSTR(x) __MSPMKSTR(x) |
| #define __MSPMKSTR(x) #x |
| |
| /* devices.csv path from the toolchain root. */ |
| static const char rest_of_devices_path[] = |
| "/" _MSPMKSTR (TARGET_SUBDIR) "/include/devices/"; |
| |
| #undef _MSPMKSTR |
| #undef __MSPMKSTR |
| |
| /* "The default value of GCC_EXEC_PREFIX is prefix/lib/gcc". Strip lib/gcc |
| from GCC_EXEC_PREFIX to get the path to the installed toolchain. */ |
| static void |
| extract_devices_dir_from_exec_prefix (char **devices_loc) |
| { |
| const char *temp; |
| char *gcc_exec_prefix = *devices_loc; |
| int len = strlen (gcc_exec_prefix); |
| |
| /* Copied from gcc.cc. */ |
| if (len > (int) sizeof ("/lib/gcc/") - 1 |
| && (IS_DIR_SEPARATOR (gcc_exec_prefix[len-1]))) |
| { |
| temp = gcc_exec_prefix + len - sizeof ("/lib/gcc/") + 1; |
| if (IS_DIR_SEPARATOR (*temp) |
| && filename_ncmp (temp + 1, "lib", 3) == 0 |
| && IS_DIR_SEPARATOR (temp[4]) |
| && filename_ncmp (temp + 5, "gcc", 3) == 0) |
| { |
| len -= sizeof ("/lib/gcc/") - 1; |
| /* Keep the '/' from the beginning of /lib/gcc. */ |
| gcc_exec_prefix[len + 1] = (char) 0; |
| *devices_loc = concat (gcc_exec_prefix, rest_of_devices_path, NULL); |
| return; |
| } |
| } |
| } |
| |
| /* Given the path to the GCC executable, return the path to the installed |
| device data in "$TOOLCHAIN_ROOT/msp430-elf/include/devices". |
| Assumes the GCC executable is in "$TOOLCHAIN_ROOT/<somedir>/". */ |
| static void |
| extract_devices_dir_from_collect_gcc (char **devices_loc) |
| { |
| char *t_devices_loc = *devices_loc; |
| /* Go up a directory to the toolchain root. */ |
| t_devices_loc = msp430_dirname (msp430_dirname (t_devices_loc)); |
| t_devices_loc = concat (t_devices_loc, rest_of_devices_path, NULL); |
| *devices_loc = t_devices_loc; |
| } |
| |
| /* The path to the MSP430-GCC support files can be specified with the |
| environment variable "MSP430_GCC_INCLUDE_DIR", or installed into the |
| toolchain in the msp430-elf/include/devices subdirectory. |
| We use the GCC_EXEC_PREFIX or COLLECT_GCC environment variables as a starting |
| point for the location of the toolchain, and work out the path to the |
| installed device data from there. |
| Return 0 and set LOCAL_DEVICES_CSV_LOC if we find devices.csv. Return 1 |
| if devices.csv wasn't found. */ |
| int |
| msp430_check_env_var_for_devices (char **local_devices_csv_loc) |
| { |
| const int num_vars = 3; |
| const char dirsep[2] = { DIR_SEPARATOR, 0 }; |
| /* Both GCC_EXEC_PREFIX and COLLECT_GCC should always be set to the format we |
| expect, as they are required for correct operation of the toolchain. |
| So if they are wrong the user will probably have bigger problems. |
| GCC_EXEC_PREFIX is only defined in the driver, whilst COLLECT_GCC is only |
| defined in the compiler proper, so we need both. */ |
| const char *env_vars[num_vars] = { |
| "MSP430_GCC_INCLUDE_DIR", "GCC_EXEC_PREFIX", "COLLECT_GCC" }; |
| enum msp430_include_vars { |
| MSP430_GCC_INCLUDE_DIR, |
| GCC_EXEC_PREFIX, |
| COLLECT_GCC |
| }; |
| FILE *devices_csv_file = NULL; |
| int i; |
| |
| for (i = MSP430_GCC_INCLUDE_DIR; i <= COLLECT_GCC; i++) |
| { |
| char *t_devices_loc; |
| char *val = getenv (env_vars[i]); |
| if (val == NULL) |
| continue; |
| t_devices_loc = xstrdup (val); |
| |
| if (i == MSP430_GCC_INCLUDE_DIR) |
| { |
| if (!IS_DIR_SEPARATOR (t_devices_loc[strlen (t_devices_loc) - 1])) |
| t_devices_loc = concat (t_devices_loc, dirsep, NULL); |
| } |
| else if (i == GCC_EXEC_PREFIX) |
| extract_devices_dir_from_exec_prefix (&t_devices_loc); |
| else if (i == COLLECT_GCC) |
| extract_devices_dir_from_collect_gcc (&t_devices_loc); |
| |
| t_devices_loc = concat (t_devices_loc, "devices.csv", NULL); |
| devices_csv_file = fopen (t_devices_loc, "r"); |
| if (devices_csv_file != NULL) |
| { |
| fclose (devices_csv_file); |
| *local_devices_csv_loc = t_devices_loc; |
| canonicalize_path_dirsep (local_devices_csv_loc); |
| return 0; |
| } |
| } |
| return 1; |
| } |
| |
| /* Spec function which searches the paths passed to the -I and -L options for |
| the "devices.csv" file. If it is found then the -mdevices-csv-loc option is |
| placed on the command line so the compiler knows the location of the |
| file. */ |
| const char * |
| msp430_check_path_for_devices (int argc, const char **argv) |
| { |
| const char dirsep[2] = { DIR_SEPARATOR, 0 }; |
| FILE * devices_file = NULL; |
| char * local_devices_csv_loc = NULL; |
| int i; |
| /* msp430_devices_csv_loc is set by -mdevices-csv-loc, derived_devices_csv_loc |
| is set by this function only. */ |
| if (msp430_devices_csv_loc || derived_devices_csv_loc) |
| return NULL; |
| for (i = 0; i < argc; i++) |
| { |
| char *inc_path = xstrdup (argv[i]); |
| canonicalize_path_dirsep (&inc_path); |
| if (!IS_DIR_SEPARATOR (inc_path[strlen (inc_path) - 1])) |
| inc_path = concat (inc_path, dirsep, NULL); |
| local_devices_csv_loc = concat (inc_path, "devices.csv", NULL); |
| devices_file = fopen (local_devices_csv_loc, "r"); |
| if (devices_file != NULL) |
| { |
| fclose (devices_file); |
| derived_devices_csv_loc = local_devices_csv_loc; |
| return concat ("-mdevices-csv-loc=", local_devices_csv_loc, NULL); |
| } |
| } |
| return NULL; |
| } |
| |
| /* Search the devices.csv file for the given MCU name, and load the device |
| data into extracted_mcu_data. |
| Return 1 if MCU wasn't found in devices.csv, or the data couldn't be loaded |
| into extracted_mcu_data. |
| devices.csv has a specific format. There is a row for column headings which |
| begins with "# Device Name". The column numbers for CPU_TYPE (MSP430 ISA) |
| and MPY_TYPE (hwmult support) are extracted from this row and used later to |
| extract the ISA and hwmult supported for the given device. |
| The rows containing the MCU data are expected to begin immediately after the |
| column headings. */ |
| static int |
| parse_devices_csv_1 (const char * real_devices_csv_loc, const char * mcu_name) |
| { |
| FILE * devices_file = fopen (real_devices_csv_loc, "r"); |
| /* Some devices have a large number of errata, which means that MPY_TYPE |
| isn't found until the ~100th character in the line. line_buf_size is set |
| to 200 to account for further possible additions to errata. */ |
| const size_t line_buf_size = 200; |
| char line[line_buf_size]; |
| char * res; |
| bool found_headings = false; |
| bool found_mcu = false; |
| int cpu_type = -1; |
| int mpy_type = -1; |
| int cpu_type_column = -1; |
| int mpy_type_column = -1; |
| const char * device_name_heading = "# Device Name"; |
| const char * cpu_type_heading = "CPU_TYPE"; |
| const char * mpy_type_heading = "MPY_TYPE"; |
| /* devices_file should never be NULL at this stage. */ |
| if (devices_file == NULL) |
| { |
| if (msp430_warn_devices_csv) |
| warning (0, "unexpected error opening %<devices.csv%>"); |
| return 1; |
| } |
| while (1) |
| { |
| res = fgets (line, line_buf_size, devices_file); |
| if (res == NULL) |
| { |
| /* The device has not been found in devices.csv. Don't warn now in |
| case it is in the hard-coded data. We will warn later if the |
| device was not found in the hard-coded data either. */ |
| goto end; |
| } |
| else if (!found_headings |
| && strncmp (line, device_name_heading, |
| strlen (device_name_heading)) == 0) |
| { |
| int curr_column = 0; |
| char * heading = strtok (line, ","); |
| found_headings = true; |
| /* Find which column MPY_TYPE and CPU_TYPE are in. */ |
| while (heading != NULL) |
| { |
| if (strncmp (heading, cpu_type_heading, |
| strlen (cpu_type_heading)) == 0) |
| cpu_type_column = curr_column; |
| else if (strncmp (heading, mpy_type_heading, |
| strlen (mpy_type_heading)) == 0) |
| mpy_type_column = curr_column; |
| if (cpu_type_column != -1 && mpy_type_column != -1) |
| break; |
| heading = strtok (NULL, ","); |
| curr_column++; |
| } |
| if (cpu_type_column == -1 || mpy_type_column == -1) |
| { |
| if (msp430_warn_devices_csv) |
| { |
| if (cpu_type_column == -1 && mpy_type_column != -1) |
| warning (0, "%<CPU_TYPE%> column heading is missing from " |
| "%<devices.csv%>"); |
| else if (mpy_type_column == -1 && cpu_type_column != -1) |
| warning (0, "%<MPY_TYPE%> column heading is missing from " |
| "%<devices.csv%>"); |
| else |
| warning (0, "%<CPU_TYPE%> and %<MPY_TYPE%> column headings " |
| "are missing from %<devices.csv%>"); |
| } |
| goto end; |
| } |
| } |
| else if (strncasecmp (line, mcu_name, strlen (mcu_name)) == 0 |
| && *(line + strlen (mcu_name)) == ',') |
| { |
| if (!found_headings) |
| { |
| if (msp430_warn_devices_csv) |
| warning (0, "format of column headings in %<devices.csv%> " |
| "is incorrect"); |
| goto end; |
| } |
| char * val = strtok (line, ","); |
| int final_col_num = ((mpy_type_column > cpu_type_column) |
| ? mpy_type_column : cpu_type_column); |
| int curr_col; |
| bool found_cpu = false; |
| bool found_mpy = false; |
| for (curr_col = 0; curr_col <= final_col_num; curr_col++) |
| { |
| /* Strip any new line characters from the last token. */ |
| if (curr_col == final_col_num && strlen (val) > 1 |
| /* ASCII digit 10 == LF, 13 == CR. */ |
| && (val[1] == 10 || val[1] == 13)) |
| { |
| /* Terminate the string after the first character. */ |
| val[1] = 0; |
| } |
| if (curr_col == cpu_type_column) |
| { |
| cpu_type = atoi (val); |
| /* Only a single '0', '1' or '2' is accepted. */ |
| if (strlen (val) != 1 |
| /* atoi will return 0 if the string passed as an argument |
| is empty or contains only whitespace characters, so we |
| must error if 0 is returned but the first character in |
| the original string is not '0'. */ |
| || (cpu_type == 0 && val[0] != '0') |
| || cpu_type > 2 || cpu_type < 0) |
| { |
| if (msp430_warn_devices_csv) |
| warning (0, "invalid %<CPU_TYPE%> value of %qs read " |
| "from %<devices.csv%> for %qs", val, mcu_name); |
| goto end; |
| } |
| extracted_mcu_data.revision = cpu_type; |
| found_cpu = true; |
| } |
| else if (curr_col == mpy_type_column) |
| { |
| mpy_type = atoi (val); |
| /* Only a single '0', '1', '2', '4' or '8' is accepted. */ |
| if (strlen (val) != 1 |
| || (mpy_type == 0 && val[0] != '0') |
| || !(mpy_type == 0 |
| || mpy_type == 1 |
| || mpy_type == 2 |
| || mpy_type == 4 |
| || mpy_type == 8)) |
| { |
| if (msp430_warn_devices_csv) |
| warning (0, "invalid %<MPY_TYPE%> value of %qs read " |
| "from %<devices.csv%> for %qs", val, mcu_name); |
| goto end; |
| } |
| extracted_mcu_data.hwmpy = mpy_type; |
| found_mpy = true; |
| } |
| if (found_cpu && found_mpy) |
| { |
| extracted_mcu_data.name = mcu_name; |
| found_mcu = true; |
| goto end; |
| } |
| val = strtok (NULL, ","); |
| } |
| if (msp430_warn_devices_csv && (cpu_type == -1 || mpy_type == -1)) |
| warning (0, "unknown error reading %s from " |
| "%<devices.csv%>", |
| (cpu_type != -1 ? "%<MPY_TYPE%>" |
| : (mpy_type != -1 ? "%<CPU_TYPE%>" |
| : "%<CPU_TYPE%> and %<MPY_TYPE%>"))); |
| goto end; |
| } |
| } |
| end: |
| fclose (devices_file); |
| if (!found_mcu) |
| return 1; |
| return 0; |
| } |
| |
| /* Wrapper for the parse_devices_csv_1 work function. |
| A return code of 0 indicates that the MCU data has been successfully |
| extracted into extracted_mcu_data. |
| A return code of 1 indicates that the specified MCU wasn't found in |
| devices.csv. |
| A return code of 2 indicates that devices.csv wasn't found at all. */ |
| static int |
| parse_devices_csv (const char * mcu_name) |
| { |
| /* First check if the path to devices.csv was set by -mdevices-csv-loc. */ |
| if (msp430_devices_csv_loc != NULL) |
| return parse_devices_csv_1 (msp430_devices_csv_loc, mcu_name); |
| /* Otherwise check if the path to devices.csv was found another way. */ |
| else if (derived_devices_csv_loc != NULL) |
| return parse_devices_csv_1 (derived_devices_csv_loc, mcu_name); |
| /* Otherwise we need to use environment variables to try and find it. */ |
| if (msp430_check_env_var_for_devices (&derived_devices_csv_loc)) |
| /* devices.csv was not found. */ |
| return 2; |
| return parse_devices_csv_1 (derived_devices_csv_loc, mcu_name); |
| } |
| |
| /* Main entry point to load the MCU data for the given -mmcu into |
| extracted_mcu_data. |
| First, the "devices.csv" MCU data file is searched for, if it is found, and |
| the MCU has a record in it, then that data is used. |
| Otherwise, hard_msp430_mcu_data (initialized at the bottom of this |
| file) is searched for the MCU name. |
| This function only needs to be executed once, but it can be first called |
| from a number of different locations. */ |
| void |
| msp430_extract_mcu_data (const char * mcu_name) |
| { |
| static int executed = 0; |
| int devices_csv_not_found = 0; |
| int i; |
| if (mcu_name == NULL || executed == 1) |
| return; |
| executed = 1; |
| /* If parse_devices_csv returns non-zero we need to use the |
| hard-coded data. */ |
| switch (parse_devices_csv (mcu_name)) |
| { |
| case 0: |
| return; |
| case 1: |
| /* MCU not found in devices.csv. Warn later if it's not in the |
| hard-coded data either. */ |
| break; |
| case 2: |
| devices_csv_not_found = 1; |
| break; |
| default: |
| gcc_unreachable (); |
| } |
| for (i = ARRAY_SIZE (hard_msp430_mcu_data); i--;) |
| if (strcasecmp (mcu_name, hard_msp430_mcu_data[i].name) == 0) |
| { |
| extracted_mcu_data = hard_msp430_mcu_data[i]; |
| break; |
| } |
| /* Validation checks. */ |
| if (extracted_mcu_data.name != NULL) |
| { |
| switch (extracted_mcu_data.hwmpy) |
| { |
| case 0: |
| case 1: |
| case 2: |
| case 4: |
| case 8: break; |
| default: |
| error ("unrecognized %<hwmpy%> field in " |
| "%<hard_msp430_mcu_data[%d]%>: %qd", i, |
| hard_msp430_mcu_data[i].hwmpy); |
| break; |
| } |
| switch (extracted_mcu_data.revision) |
| { |
| case 0: |
| case 1: |
| case 2: break; |
| default: |
| error ("unrecognized %<revision%> field in " |
| "%<hard_msp430_mcu_data[%d]%>: %qd", i, |
| hard_msp430_mcu_data[i].revision); |
| } |
| } |
| else if (msp430_warn_devices_csv && devices_csv_not_found) |
| warning (0, "could not locate MCU data file %<devices.csv%>"); |
| else if (msp430_warn_mcu && extracted_mcu_data.name == NULL) |
| { |
| /* FIXME: We should warn here that the MCU name is unrecognized, but |
| msp430_option_override will warn about an unrecognized MCU as well. |
| The benefit of warning here is that this is code common to both the |
| driver and compiler proper, so a warning will be emitted when |
| assembling/linking via the driver, whilst msp430_option_override will |
| only be called when preprocessing or compiling. */ |
| } |
| } |
| |
| /* The data in this structure has been extracted from version 1.194 of the |
| devices.csv file released by TI in September 2016. */ |
| |
| struct t_msp430_mcu_data hard_msp430_mcu_data[605] = |
| { |
| { "cc430f5123",2,8 }, |
| { "cc430f5125",2,8 }, |
| { "cc430f5133",2,8 }, |
| { "cc430f5135",2,8 }, |
| { "cc430f5137",2,8 }, |
| { "cc430f5143",2,8 }, |
| { "cc430f5145",2,8 }, |
| { "cc430f5147",2,8 }, |
| { "cc430f6125",2,8 }, |
| { "cc430f6126",2,8 }, |
| { "cc430f6127",2,8 }, |
| { "cc430f6135",2,8 }, |
| { "cc430f6137",2,8 }, |
| { "cc430f6143",2,8 }, |
| { "cc430f6145",2,8 }, |
| { "cc430f6147",2,8 }, |
| { "msp430afe221",0,2 }, |
| { "msp430afe222",0,2 }, |
| { "msp430afe223",0,2 }, |
| { "msp430afe231",0,2 }, |
| { "msp430afe232",0,2 }, |
| { "msp430afe233",0,2 }, |
| { "msp430afe251",0,2 }, |
| { "msp430afe252",0,2 }, |
| { "msp430afe253",0,2 }, |
| { "msp430bt5190",2,8 }, |
| { "msp430c091",0,0 }, |
| { "msp430c092",0,0 }, |
| { "msp430c111",0,0 }, |
| { "msp430c1111",0,0 }, |
| { "msp430c112",0,0 }, |
| { "msp430c1121",0,0 }, |
| { "msp430c1331",0,0 }, |
| { "msp430c1351",0,0 }, |
| { "msp430c311s",0,0 }, |
| { "msp430c312",0,0 }, |
| { "msp430c313",0,0 }, |
| { "msp430c314",0,0 }, |
| { "msp430c315",0,0 }, |
| { "msp430c323",0,0 }, |
| { "msp430c325",0,0 }, |
| { "msp430c336",0,1 }, |
| { "msp430c337",0,1 }, |
| { "msp430c412",0,0 }, |
| { "msp430c413",0,0 }, |
| { "msp430cg4616",1,1 }, |
| { "msp430cg4617",1,1 }, |
| { "msp430cg4618",1,1 }, |
| { "msp430cg4619",1,1 }, |
| { "msp430e112",0,0 }, |
| { "msp430e313",0,0 }, |
| { "msp430e315",0,0 }, |
| { "msp430e325",0,0 }, |
| { "msp430e337",0,1 }, |
| { "msp430f110",0,0 }, |
| { "msp430f1101",0,0 }, |
| { "msp430f1101a",0,0 }, |
| { "msp430f1111",0,0 }, |
| { "msp430f1111a",0,0 }, |
| { "msp430f112",0,0 }, |
| { "msp430f1121",0,0 }, |
| { "msp430f1121a",0,0 }, |
| { "msp430f1122",0,0 }, |
| { "msp430f1132",0,0 }, |
| { "msp430f122",0,0 }, |
| { "msp430f1222",0,0 }, |
| { "msp430f123",0,0 }, |
| { "msp430f1232",0,0 }, |
| { "msp430f133",0,0 }, |
| { "msp430f135",0,0 }, |
| { "msp430f147",0,1 }, |
| { "msp430f1471",0,1 }, |
| { "msp430f148",0,1 }, |
| { "msp430f1481",0,1 }, |
| { "msp430f149",0,1 }, |
| { "msp430f1491",0,1 }, |
| { "msp430f155",0,0 }, |
| { "msp430f156",0,0 }, |
| { "msp430f157",0,0 }, |
| { "msp430f1610",0,1 }, |
| { "msp430f1611",0,1 }, |
| { "msp430f1612",0,1 }, |
| { "msp430f167",0,1 }, |
| { "msp430f168",0,1 }, |
| { "msp430f169",0,1 }, |
| { "msp430f2001",0,0 }, |
| { "msp430f2002",0,0 }, |
| { "msp430f2003",0,0 }, |
| { "msp430f2011",0,0 }, |
| { "msp430f2012",0,0 }, |
| { "msp430f2013",0,0 }, |
| { "msp430f2101",0,0 }, |
| { "msp430f2111",0,0 }, |
| { "msp430f2112",0,0 }, |
| { "msp430f2121",0,0 }, |
| { "msp430f2122",0,0 }, |
| { "msp430f2131",0,0 }, |
| { "msp430f2132",0,0 }, |
| { "msp430f2232",0,0 }, |
| { "msp430f2234",0,0 }, |
| { "msp430f2252",0,0 }, |
| { "msp430f2254",0,0 }, |
| { "msp430f2272",0,0 }, |
| { "msp430f2274",0,0 }, |
| { "msp430f233",0,2 }, |
| { "msp430f2330",0,2 }, |
| { "msp430f235",0,2 }, |
| { "msp430f2350",0,2 }, |
| { "msp430f2370",0,2 }, |
| { "msp430f2410",0,2 }, |
| { "msp430f2416",1,2 }, |
| { "msp430f2417",1,2 }, |
| { "msp430f2418",1,2 }, |
| { "msp430f2419",1,2 }, |
| { "msp430f247",0,2 }, |
| { "msp430f2471",0,2 }, |
| { "msp430f248",0,2 }, |
| { "msp430f2481",0,2 }, |
| { "msp430f249",0,2 }, |
| { "msp430f2491",0,2 }, |
| { "msp430f2616",1,2 }, |
| { "msp430f2617",1,2 }, |
| { "msp430f2618",1,2 }, |
| { "msp430f2619",1,2 }, |
| { "msp430f412",0,0 }, |
| { "msp430f413",0,0 }, |
| { "msp430f4132",0,0 }, |
| { "msp430f415",0,0 }, |
| { "msp430f4152",0,0 }, |
| { "msp430f417",0,0 }, |
| { "msp430f423",0,1 }, |
| { "msp430f423a",0,1 }, |
| { "msp430f425",0,1 }, |
| { "msp430f4250",0,0 }, |
| { "msp430f425a",0,1 }, |
| { "msp430f4260",0,0 }, |
| { "msp430f427",0,1 }, |
| { "msp430f4270",0,0 }, |
| { "msp430f427a",0,1 }, |
| { "msp430f435",0,0 }, |
| { "msp430f4351",0,0 }, |
| { "msp430f436",0,0 }, |
| { "msp430f4361",0,0 }, |
| { "msp430f437",0,0 }, |
| { "msp430f4371",0,0 }, |
| { "msp430f438",0,0 }, |
| { "msp430f439",0,0 }, |
| { "msp430f447",0,1 }, |
| { "msp430f448",0,1 }, |
| { "msp430f4481",0,1 }, |
| { "msp430f449",0,1 }, |
| { "msp430f4491",0,1 }, |
| { "msp430f4616",1,1 }, |
| { "msp430f46161",1,1 }, |
| { "msp430f4617",1,1 }, |
| { "msp430f46171",1,1 }, |
| { "msp430f4618",1,1 }, |
| { "msp430f46181",1,1 }, |
| { "msp430f4619",1,1 }, |
| { "msp430f46191",1,1 }, |
| { "msp430f47126",1,4 }, |
| { "msp430f47127",1,4 }, |
| { "msp430f47163",1,4 }, |
| { "msp430f47166",1,4 }, |
| { "msp430f47167",1,4 }, |
| { "msp430f47173",1,4 }, |
| { "msp430f47176",1,4 }, |
| { "msp430f47177",1,4 }, |
| { "msp430f47183",1,4 }, |
| { "msp430f47186",1,4 }, |
| { "msp430f47187",1,4 }, |
| { "msp430f47193",1,4 }, |
| { "msp430f47196",1,4 }, |
| { "msp430f47197",1,4 }, |
| { "msp430f477",0,0 }, |
| { "msp430f478",0,0 }, |
| { "msp430f4783",0,4 }, |
| { "msp430f4784",0,4 }, |
| { "msp430f479",0,0 }, |
| { "msp430f4793",0,4 }, |
| { "msp430f4794",0,4 }, |
| { "msp430f5131",2,8 }, |
| { "msp430f5132",2,8 }, |
| { "msp430f5151",2,8 }, |
| { "msp430f5152",2,8 }, |
| { "msp430f5171",2,8 }, |
| { "msp430f5172",2,8 }, |
| { "msp430f5212",2,8 }, |
| { "msp430f5213",2,8 }, |
| { "msp430f5214",2,8 }, |
| { "msp430f5217",2,8 }, |
| { "msp430f5218",2,8 }, |
| { "msp430f5219",2,8 }, |
| { "msp430f5222",2,8 }, |
| { "msp430f5223",2,8 }, |
| { "msp430f5224",2,8 }, |
| { "msp430f5227",2,8 }, |
| { "msp430f5228",2,8 }, |
| { "msp430f5229",2,8 }, |
| { "msp430f5232",2,8 }, |
| { "msp430f5234",2,8 }, |
| { "msp430f5237",2,8 }, |
| { "msp430f5239",2,8 }, |
| { "msp430f5242",2,8 }, |
| { "msp430f5244",2,8 }, |
| { "msp430f5247",2,8 }, |
| { "msp430f5249",2,8 }, |
| { "msp430f5252",2,8 }, |
| { "msp430f5253",2,8 }, |
| { "msp430f5254",2,8 }, |
| { "msp430f5255",2,8 }, |
| { "msp430f5256",2,8 }, |
| { "msp430f5257",2,8 }, |
| { "msp430f5258",2,8 }, |
| { "msp430f5259",2,8 }, |
| { "msp430f5304",2,8 }, |
| { "msp430f5308",2,8 }, |
| { "msp430f5309",2,8 }, |
| { "msp430f5310",2,8 }, |
| { "msp430f5324",2,8 }, |
| { "msp430f5325",2,8 }, |
| { "msp430f5326",2,8 }, |
| { "msp430f5327",2,8 }, |
| { "msp430f5328",2,8 }, |
| { "msp430f5329",2,8 }, |
| { "msp430f5333",2,8 }, |
| { "msp430f5335",2,8 }, |
| { "msp430f5336",2,8 }, |
| { "msp430f5338",2,8 }, |
| { "msp430f5340",2,8 }, |
| { "msp430f5341",2,8 }, |
| { "msp430f5342",2,8 }, |
| { "msp430f5358",2,8 }, |
| { "msp430f5359",2,8 }, |
| { "msp430f5418",2,8 }, |
| { "msp430f5418a",2,8 }, |
| { "msp430f5419",2,8 }, |
| { "msp430f5419a",2,8 }, |
| { "msp430f5435",2,8 }, |
| { "msp430f5435a",2,8 }, |
| { "msp430f5436",2,8 }, |
| { "msp430f5436a",2,8 }, |
| { "msp430f5437",2,8 }, |
| { "msp430f5437a",2,8 }, |
| { "msp430f5438",2,8 }, |
| { "msp430f5438a",2,8 }, |
| { "msp430f5500",2,8 }, |
| { "msp430f5501",2,8 }, |
| { "msp430f5502",2,8 }, |
| { "msp430f5503",2,8 }, |
| { "msp430f5504",2,8 }, |
| { "msp430f5505",2,8 }, |
| { "msp430f5506",2,8 }, |
| { "msp430f5507",2,8 }, |
| { "msp430f5508",2,8 }, |
| { "msp430f5509",2,8 }, |
| { "msp430f5510",2,8 }, |
| { "msp430f5513",2,8 }, |
| { "msp430f5514",2,8 }, |
| { "msp430f5515",2,8 }, |
| { "msp430f5517",2,8 }, |
| { "msp430f5519",2,8 }, |
| { "msp430f5521",2,8 }, |
| { "msp430f5522",2,8 }, |
| { "msp430f5524",2,8 }, |
| { "msp430f5525",2,8 }, |
| { "msp430f5526",2,8 }, |
| { "msp430f5527",2,8 }, |
| { "msp430f5528",2,8 }, |
| { "msp430f5529",2,8 }, |
| { "msp430f5630",2,8 }, |
| { "msp430f5631",2,8 }, |
| { "msp430f5632",2,8 }, |
| { "msp430f5633",2,8 }, |
| { "msp430f5634",2,8 }, |
| { "msp430f5635",2,8 }, |
| { "msp430f5636",2,8 }, |
| { "msp430f5637",2,8 }, |
| { "msp430f5638",2,8 }, |
| { "msp430f5658",2,8 }, |
| { "msp430f5659",2,8 }, |
| { "msp430f5xx_6xxgeneric",2,8 }, |
| { "msp430f6433",2,8 }, |
| { "msp430f6435",2,8 }, |
| { "msp430f6436",2,8 }, |
| { "msp430f6438",2,8 }, |
| { "msp430f6458",2,8 }, |
| { "msp430f6459",2,8 }, |
| { "msp430f6630",2,8 }, |
| { "msp430f6631",2,8 }, |
| { "msp430f6632",2,8 }, |
| { "msp430f6633",2,8 }, |
| { "msp430f6634",2,8 }, |
| { "msp430f6635",2,8 }, |
| { "msp430f6636",2,8 }, |
| { "msp430f6637",2,8 }, |
| { "msp430f6638",2,8 }, |
| { "msp430f6658",2,8 }, |
| { "msp430f6659",2,8 }, |
| { "msp430f6720",2,8 }, |
| { "msp430f6720a",2,8 }, |
| { "msp430f6721",2,8 }, |
| { "msp430f6721a",2,8 }, |
| { "msp430f6723",2,8 }, |
| { "msp430f6723a",2,8 }, |
| { "msp430f6724",2,8 }, |
| { "msp430f6724a",2,8 }, |
| { "msp430f6725",2,8 }, |
| { "msp430f6725a",2,8 }, |
| { "msp430f6726",2,8 }, |
| { "msp430f6726a",2,8 }, |
| { "msp430f6730",2,8 }, |
| { "msp430f6730a",2,8 }, |
| { "msp430f6731",2,8 }, |
| { "msp430f6731a",2,8 }, |
| { "msp430f6733",2,8 }, |
| { "msp430f6733a",2,8 }, |
| { "msp430f6734",2,8 }, |
| { "msp430f6734a",2,8 }, |
| { "msp430f6735",2,8 }, |
| { "msp430f6735a",2,8 }, |
| { "msp430f6736",2,8 }, |
| { "msp430f6736a",2,8 }, |
| { "msp430f6745",2,8 }, |
| { "msp430f67451",2,8 }, |
| { "msp430f67451a",2,8 }, |
| { "msp430f6745a",2,8 }, |
| { "msp430f6746",2,8 }, |
| { "msp430f67461",2,8 }, |
| { "msp430f67461a",2,8 }, |
| { "msp430f6746a",2,8 }, |
| { "msp430f6747",2,8 }, |
| { "msp430f67471",2,8 }, |
| { "msp430f67471a",2,8 }, |
| { "msp430f6747a",2,8 }, |
| { "msp430f6748",2,8 }, |
| { "msp430f67481",2,8 }, |
| { "msp430f67481a",2,8 }, |
| { "msp430f6748a",2,8 }, |
| { "msp430f6749",2,8 }, |
| { "msp430f67491",2,8 }, |
| { "msp430f67491a",2,8 }, |
| { "msp430f6749a",2,8 }, |
| { "msp430f67621",2,8 }, |
| { "msp430f67621a",2,8 }, |
| { "msp430f67641",2,8 }, |
| { "msp430f67641a",2,8 }, |
| { "msp430f6765",2,8 }, |
| { "msp430f67651",2,8 }, |
| { "msp430f67651a",2,8 }, |
| { "msp430f6765a",2,8 }, |
| { "msp430f6766",2,8 }, |
| { "msp430f67661",2,8 }, |
| { "msp430f67661a",2,8 }, |
| { "msp430f6766a",2,8 }, |
| { "msp430f6767",2,8 }, |
| { "msp430f67671",2,8 }, |
| { "msp430f67671a",2,8 }, |
| { "msp430f6767a",2,8 }, |
| { "msp430f6768",2,8 }, |
| { "msp430f67681",2,8 }, |
| { "msp430f67681a",2,8 }, |
| { "msp430f6768a",2,8 }, |
| { "msp430f6769",2,8 }, |
| { "msp430f67691",2,8 }, |
| { "msp430f67691a",2,8 }, |
| { "msp430f6769a",2,8 }, |
| { "msp430f6775",2,8 }, |
| { "msp430f67751",2,8 }, |
| { "msp430f67751a",2,8 }, |
| { "msp430f6775a",2,8 }, |
| { "msp430f6776",2,8 }, |
| { "msp430f67761",2,8 }, |
| { "msp430f67761a",2,8 }, |
| { "msp430f6776a",2,8 }, |
| { "msp430f6777",2,8 }, |
| { "msp430f67771",2,8 }, |
| { "msp430f67771a",2,8 }, |
| { "msp430f6777a",2,8 }, |
| { "msp430f6778",2,8 }, |
| { "msp430f67781",2,8 }, |
| { "msp430f67781a",2,8 }, |
| { "msp430f6778a",2,8 }, |
| { "msp430f6779",2,8 }, |
| { "msp430f67791",2,8 }, |
| { "msp430f67791a",2,8 }, |
| { "msp430f6779a",2,8 }, |
| { "msp430fe423",0,0 }, |
| { "msp430fe4232",0,0 }, |
| { "msp430fe423a",0,0 }, |
| { "msp430fe4242",0,0 }, |
| { "msp430fe425",0,0 }, |
| { "msp430fe4252",0,0 }, |
| { "msp430fe425a",0,0 }, |
| { "msp430fe427",0,0 }, |
| { "msp430fe4272",0,0 }, |
| { "msp430fe427a",0,0 }, |
| { "msp430fg4250",0,0 }, |
| { "msp430fg4260",0,0 }, |
| { "msp430fg4270",0,0 }, |
| { "msp430fg437",0,0 }, |
| { "msp430fg438",0,0 }, |
| { "msp430fg439",0,0 }, |
| { "msp430fg4616",1,1 }, |
| { "msp430fg4617",1,1 }, |
| { "msp430fg4618",1,1 }, |
| { "msp430fg4619",1,1 }, |
| { "msp430fg477",0,0 }, |
| { "msp430fg478",0,0 }, |
| { "msp430fg479",0,0 }, |
| { "msp430fg6425",2,8 }, |
| { "msp430fg6426",2,8 }, |
| { "msp430fg6625",2,8 }, |
| { "msp430fg6626",2,8 }, |
| { "msp430fr2032",2,0 }, |
| { "msp430fr2033",2,0 }, |
| { "msp430fr2110",2,0 }, |
| { "msp430fr2111",2,0 }, |
| { "msp430fr2310",2,0 }, |
| { "msp430fr2311",2,0 }, |
| { "msp430fr2433",2,8 }, |
| { "msp430fr2532",2,8 }, |
| { "msp430fr2533",2,8 }, |
| { "msp430fr2632",2,8 }, |
| { "msp430fr2633",2,8 }, |
| { "msp430fr2xx_4xxgeneric",2,8 }, |
| { "msp430fr4131",2,0 }, |
| { "msp430fr4132",2,0 }, |
| { "msp430fr4133",2,0 }, |
| { "msp430fr5720",2,8 }, |
| { "msp430fr5721",2,8 }, |
| { "msp430fr5722",2,8 }, |
| { "msp430fr5723",2,8 }, |
| { "msp430fr5724",2,8 }, |
| { "msp430fr5725",2,8 }, |
| { "msp430fr5726",2,8 }, |
| { "msp430fr5727",2,8 }, |
| { "msp430fr5728",2,8 }, |
| { "msp430fr5729",2,8 }, |
| { "msp430fr5730",2,8 }, |
| { "msp430fr5731",2,8 }, |
| { "msp430fr5732",2,8 }, |
| { "msp430fr5733",2,8 }, |
| { "msp430fr5734",2,8 }, |
| { "msp430fr5735",2,8 }, |
| { "msp430fr5736",2,8 }, |
| { "msp430fr5737",2,8 }, |
| { "msp430fr5738",2,8 }, |
| { "msp430fr5739",2,8 }, |
| { "msp430fr57xxgeneric",2,8 }, |
| { "msp430fr5847",2,8 }, |
| { "msp430fr58471",2,8 }, |
| { "msp430fr5848",2,8 }, |
| { "msp430fr5849",2,8 }, |
| { "msp430fr5857",2,8 }, |
| { "msp430fr5858",2,8 }, |
| { "msp430fr5859",2,8 }, |
| { "msp430fr5867",2,8 }, |
| { "msp430fr58671",2,8 }, |
| { "msp430fr5868",2,8 }, |
| { "msp430fr5869",2,8 }, |
| { "msp430fr5870",2,8 }, |
| { "msp430fr5872",2,8 }, |
| { "msp430fr58721",2,8 }, |
| { "msp430fr5887",2,8 }, |
| { "msp430fr5888",2,8 }, |
| { "msp430fr5889",2,8 }, |
| { "msp430fr58891",2,8 }, |
| { "msp430fr5922",2,8 }, |
| { "msp430fr59221",2,8 }, |
| { "msp430fr5947",2,8 }, |
| { "msp430fr59471",2,8 }, |
| { "msp430fr5948",2,8 }, |
| { "msp430fr5949",2,8 }, |
| { "msp430fr5957",2,8 }, |
| { "msp430fr5958",2,8 }, |
| { "msp430fr5959",2,8 }, |
| { "msp430fr5962",2,8 }, |
| { "msp430fr5964",2,8 }, |
| { "msp430fr5967",2,8 }, |
| { "msp430fr5968",2,8 }, |
| { "msp430fr5969",2,8 }, |
| { "msp430fr59691",2,8 }, |
| { "msp430fr5970",2,8 }, |
| { "msp430fr5972",2,8 }, |
| { "msp430fr59721",2,8 }, |
| { "msp430fr5986",2,8 }, |
| { "msp430fr5987",2,8 }, |
| { "msp430fr5988",2,8 }, |
| { "msp430fr5989",2,8 }, |
| { "msp430fr59891",2,8 }, |
| { "msp430fr5992",2,8 }, |
| { "msp430fr5994",2,8 }, |
| { "msp430fr59941",2,8 }, |
| { "msp430fr5xx_6xxgeneric",2,8 }, |
| { "msp430fr6820",2,8 }, |
| { "msp430fr6822",2,8 }, |
| { "msp430fr68221",2,8 }, |
| { "msp430fr6870",2,8 }, |
| { "msp430fr6872",2,8 }, |
| { "msp430fr68721",2,8 }, |
| { "msp430fr6877",2,8 }, |
| { "msp430fr6879",2,8 }, |
| { "msp430fr68791",2,8 }, |
| { "msp430fr6887",2,8 }, |
| { "msp430fr6888",2,8 }, |
| { "msp430fr6889",2,8 }, |
| { "msp430fr68891",2,8 }, |
| { "msp430fr6920",2,8 }, |
| { "msp430fr6922",2,8 }, |
| { "msp430fr69221",2,8 }, |
| { "msp430fr6927",2,8 }, |
| { "msp430fr69271",2,8 }, |
| { "msp430fr6928",2,8 }, |
| { "msp430fr6970",2,8 }, |
| { "msp430fr6972",2,8 }, |
| { "msp430fr69721",2,8 }, |
| { "msp430fr6977",2,8 }, |
| { "msp430fr6979",2,8 }, |
| { "msp430fr69791",2,8 }, |
| { "msp430fr6987",2,8 }, |
| { "msp430fr6988",2,8 }, |
| { "msp430fr6989",2,8 }, |
| { "msp430fr69891",2,8 }, |
| { "msp430fw423",0,0 }, |
| { "msp430fw425",0,0 }, |
| { "msp430fw427",0,0 }, |
| { "msp430fw428",0,0 }, |
| { "msp430fw429",0,0 }, |
| { "msp430g2001",0,0 }, |
| { "msp430g2101",0,0 }, |
| { "msp430g2102",0,0 }, |
| { "msp430g2111",0,0 }, |
| { "msp430g2112",0,0 }, |
| { "msp430g2113",0,0 }, |
| { "msp430g2121",0,0 }, |
| { "msp430g2131",0,0 }, |
| { "msp430g2132",0,0 }, |
| { "msp430g2152",0,0 }, |
| { "msp430g2153",0,0 }, |
| { "msp430g2201",0,0 }, |
| { "msp430g2202",0,0 }, |
| { "msp430g2203",0,0 }, |
| { "msp430g2210",0,0 }, |
| { "msp430g2211",0,0 }, |
| { "msp430g2212",0,0 }, |
| { "msp430g2213",0,0 }, |
| { "msp430g2221",0,0 }, |
| { "msp430g2230",0,0 }, |
| { "msp430g2231",0,0 }, |
| { "msp430g2232",0,0 }, |
| { "msp430g2233",0,0 }, |
| { "msp430g2252",0,0 }, |
| { "msp430g2253",0,0 }, |
| { "msp430g2302",0,0 }, |
| { "msp430g2303",0,0 }, |
| { "msp430g2312",0,0 }, |
| { "msp430g2313",0,0 }, |
| { "msp430g2332",0,0 }, |
| { "msp430g2333",0,0 }, |
| { "msp430g2352",0,0 }, |
| { "msp430g2353",0,0 }, |
| { "msp430g2402",0,0 }, |
| { "msp430g2403",0,0 }, |
| { "msp430g2412",0,0 }, |
| { "msp430g2413",0,0 }, |
| { "msp430g2432",0,0 }, |
| { "msp430g2433",0,0 }, |
| { "msp430g2444",0,0 }, |
| { "msp430g2452",0,0 }, |
| { "msp430g2453",0,0 }, |
| { "msp430g2513",0,0 }, |
| { "msp430g2533",0,0 }, |
| { "msp430g2544",0,0 }, |
| { "msp430g2553",0,0 }, |
| { "msp430g2744",0,0 }, |
| { "msp430g2755",0,0 }, |
| { "msp430g2855",0,0 }, |
| { "msp430g2955",0,0 }, |
| { "msp430i2020",0,2 }, |
| { "msp430i2021",0,2 }, |
| { "msp430i2030",0,2 }, |
| { "msp430i2031",0,2 }, |
| { "msp430i2040",0,2 }, |
| { "msp430i2041",0,2 }, |
| { "msp430i2xxgeneric",0,2 }, |
| { "msp430l092",0,0 }, |
| { "msp430p112",0,0 }, |
| { "msp430p313",0,0 }, |
| { "msp430p315",0,0 }, |
| { "msp430p315s",0,0 }, |
| { "msp430p325",0,0 }, |
| { "msp430p337",0,1 }, |
| { "msp430sl5438a",2,8 }, |
| { "msp430tch5e",0,0 }, |
| { "msp430xgeneric",2,8 }, |
| { "rf430f5144",2,8 }, |
| { "rf430f5155",2,8 }, |
| { "rf430f5175",2,8 }, |
| { "rf430frl152h",0,0 }, |
| { "rf430frl152h_rom",0,0 }, |
| { "rf430frl153h",0,0 }, |
| { "rf430frl153h_rom",0,0 }, |
| { "rf430frl154h",0,0 }, |
| { "rf430frl154h_rom",0,0 } |
| }; |