blob: 8a3d0900f765b6b4d1497a3eef081fcb3faefc1f [file] [log] [blame]
/* Subroutines used for reading MCU data on TI MSP430 processors.
Copyright (C) 2019-2021 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.c. */
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 }
};