1 /* Subroutines used for reading MCU data on TI MSP430 processors.
2 Copyright (C) 2019-2021 Free Software Foundation, Inc.
3 Contributed by Jozef Lawrynowicz <jozef.l@mittosystems.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
28 #include "diagnostic-core.h"
29 #include "langhooks.h"
32 #include "msp430-devices.h"
34 struct t_msp430_mcu_data extracted_mcu_data
;
35 /* Initialized at the bottom of this file. */
36 extern struct t_msp430_mcu_data hard_msp430_mcu_data
[605];
38 /* Set to the full path to devices.csv if it is found by searching the -I and
40 char *derived_devices_csv_loc
= NULL
;
42 /* This is to canonicalize the directory separators in the path.
43 On Windows we could have a mix of '/' and '\' in the path. */
45 canonicalize_path_dirsep (char **path
)
48 int len
= strlen (t_path
);
50 for (i
= 0; i
< len
; i
++)
51 if (IS_DIR_SEPARATOR (t_path
[i
]))
52 t_path
[i
] = DIR_SEPARATOR
;
55 /* This function returns the enclosing directory of PATH.
56 It is inconsequential whether PATH ends in a dirsep or not.
57 It modifies the string pointed to by PATH. */
59 msp430_dirname (char *path
)
61 int last_elem
= strlen (path
) - 1;
62 int i
= last_elem
- (IS_DIR_SEPARATOR (path
[last_elem
]) ? 1 : 0);
65 if (IS_DIR_SEPARATOR (path
[i
]))
74 /* We need to support both the msp430-elf and msp430-elfbare target aliases.
75 gcc/config/msp430/t-msp430 will define TARGET_SUBDIR to the target_subdir
76 Makefile variable, which will evaluate to the correct subdirectory that
77 needs to be searched for devices.csv. */
79 #define TARGET_SUBDIR msp430-elf
82 #define _MSPMKSTR(x) __MSPMKSTR(x)
83 #define __MSPMKSTR(x) #x
85 /* devices.csv path from the toolchain root. */
86 static const char rest_of_devices_path
[] =
87 "/" _MSPMKSTR (TARGET_SUBDIR
) "/include/devices/";
92 /* "The default value of GCC_EXEC_PREFIX is prefix/lib/gcc". Strip lib/gcc
93 from GCC_EXEC_PREFIX to get the path to the installed toolchain. */
95 extract_devices_dir_from_exec_prefix (char **devices_loc
)
98 char *gcc_exec_prefix
= *devices_loc
;
99 int len
= strlen (gcc_exec_prefix
);
101 /* Copied from gcc.c. */
102 if (len
> (int) sizeof ("/lib/gcc/") - 1
103 && (IS_DIR_SEPARATOR (gcc_exec_prefix
[len
-1])))
105 temp
= gcc_exec_prefix
+ len
- sizeof ("/lib/gcc/") + 1;
106 if (IS_DIR_SEPARATOR (*temp
)
107 && filename_ncmp (temp
+ 1, "lib", 3) == 0
108 && IS_DIR_SEPARATOR (temp
[4])
109 && filename_ncmp (temp
+ 5, "gcc", 3) == 0)
111 len
-= sizeof ("/lib/gcc/") - 1;
112 /* Keep the '/' from the beginning of /lib/gcc. */
113 gcc_exec_prefix
[len
+ 1] = (char) 0;
114 *devices_loc
= concat (gcc_exec_prefix
, rest_of_devices_path
, NULL
);
120 /* Given the path to the GCC executable, return the path to the installed
121 device data in "$TOOLCHAIN_ROOT/msp430-elf/include/devices".
122 Assumes the GCC executable is in "$TOOLCHAIN_ROOT/<somedir>/". */
124 extract_devices_dir_from_collect_gcc (char **devices_loc
)
126 char *t_devices_loc
= *devices_loc
;
127 /* Go up a directory to the toolchain root. */
128 t_devices_loc
= msp430_dirname (msp430_dirname (t_devices_loc
));
129 t_devices_loc
= concat (t_devices_loc
, rest_of_devices_path
, NULL
);
130 *devices_loc
= t_devices_loc
;
133 /* The path to the MSP430-GCC support files can be specified with the
134 environment variable "MSP430_GCC_INCLUDE_DIR", or installed into the
135 toolchain in the msp430-elf/include/devices subdirectory.
136 We use the GCC_EXEC_PREFIX or COLLECT_GCC environment variables as a starting
137 point for the location of the toolchain, and work out the path to the
138 installed device data from there.
139 Return 0 and set LOCAL_DEVICES_CSV_LOC if we find devices.csv. Return 1
140 if devices.csv wasn't found. */
142 msp430_check_env_var_for_devices (char **local_devices_csv_loc
)
144 const int num_vars
= 3;
145 const char dirsep
[2] = { DIR_SEPARATOR
, 0 };
146 /* Both GCC_EXEC_PREFIX and COLLECT_GCC should always be set to the format we
147 expect, as they are required for correct operation of the toolchain.
148 So if they are wrong the user will probably have bigger problems.
149 GCC_EXEC_PREFIX is only defined in the driver, whilst COLLECT_GCC is only
150 defined in the compiler proper, so we need both. */
151 const char *env_vars
[num_vars
] = {
152 "MSP430_GCC_INCLUDE_DIR", "GCC_EXEC_PREFIX", "COLLECT_GCC" };
153 enum msp430_include_vars
{
154 MSP430_GCC_INCLUDE_DIR
,
158 FILE *devices_csv_file
= NULL
;
161 for (i
= MSP430_GCC_INCLUDE_DIR
; i
<= COLLECT_GCC
; i
++)
164 char *val
= getenv (env_vars
[i
]);
167 t_devices_loc
= xstrdup (val
);
169 if (i
== MSP430_GCC_INCLUDE_DIR
)
171 if (!IS_DIR_SEPARATOR (t_devices_loc
[strlen (t_devices_loc
) - 1]))
172 t_devices_loc
= concat (t_devices_loc
, dirsep
, NULL
);
174 else if (i
== GCC_EXEC_PREFIX
)
175 extract_devices_dir_from_exec_prefix (&t_devices_loc
);
176 else if (i
== COLLECT_GCC
)
177 extract_devices_dir_from_collect_gcc (&t_devices_loc
);
179 t_devices_loc
= concat (t_devices_loc
, "devices.csv", NULL
);
180 devices_csv_file
= fopen (t_devices_loc
, "r");
181 if (devices_csv_file
!= NULL
)
183 fclose (devices_csv_file
);
184 *local_devices_csv_loc
= t_devices_loc
;
185 canonicalize_path_dirsep (local_devices_csv_loc
);
192 /* Spec function which searches the paths passed to the -I and -L options for
193 the "devices.csv" file. If it is found then the -mdevices-csv-loc option is
194 placed on the command line so the compiler knows the location of the
197 msp430_check_path_for_devices (int argc
, const char **argv
)
199 const char dirsep
[2] = { DIR_SEPARATOR
, 0 };
200 FILE * devices_file
= NULL
;
201 char * local_devices_csv_loc
= NULL
;
203 /* msp430_devices_csv_loc is set by -mdevices-csv-loc, derived_devices_csv_loc
204 is set by this function only. */
205 if (msp430_devices_csv_loc
|| derived_devices_csv_loc
)
207 for (i
= 0; i
< argc
; i
++)
209 char *inc_path
= xstrdup (argv
[i
]);
210 canonicalize_path_dirsep (&inc_path
);
211 if (!IS_DIR_SEPARATOR (inc_path
[strlen (inc_path
) - 1]))
212 inc_path
= concat (inc_path
, dirsep
, NULL
);
213 local_devices_csv_loc
= concat (inc_path
, "devices.csv", NULL
);
214 devices_file
= fopen (local_devices_csv_loc
, "r");
215 if (devices_file
!= NULL
)
217 fclose (devices_file
);
218 derived_devices_csv_loc
= local_devices_csv_loc
;
219 return concat ("-mdevices-csv-loc=", local_devices_csv_loc
, NULL
);
225 /* Search the devices.csv file for the given MCU name, and load the device
226 data into extracted_mcu_data.
227 Return 1 if MCU wasn't found in devices.csv, or the data couldn't be loaded
228 into extracted_mcu_data.
229 devices.csv has a specific format. There is a row for column headings which
230 begins with "# Device Name". The column numbers for CPU_TYPE (MSP430 ISA)
231 and MPY_TYPE (hwmult support) are extracted from this row and used later to
232 extract the ISA and hwmult supported for the given device.
233 The rows containing the MCU data are expected to begin immediately after the
236 parse_devices_csv_1 (const char * real_devices_csv_loc
, const char * mcu_name
)
238 FILE * devices_file
= fopen (real_devices_csv_loc
, "r");
239 /* Some devices have a large number of errata, which means that MPY_TYPE
240 isn't found until the ~100th character in the line. line_buf_size is set
241 to 200 to account for further possible additions to errata. */
242 const size_t line_buf_size
= 200;
243 char line
[line_buf_size
];
245 bool found_headings
= false;
246 bool found_mcu
= false;
249 int cpu_type_column
= -1;
250 int mpy_type_column
= -1;
251 const char * device_name_heading
= "# Device Name";
252 const char * cpu_type_heading
= "CPU_TYPE";
253 const char * mpy_type_heading
= "MPY_TYPE";
254 /* devices_file should never be NULL at this stage. */
255 if (devices_file
== NULL
)
257 if (msp430_warn_devices_csv
)
258 warning (0, "unexpected error opening %<devices.csv%>");
263 res
= fgets (line
, line_buf_size
, devices_file
);
266 /* The device has not been found in devices.csv. Don't warn now in
267 case it is in the hard-coded data. We will warn later if the
268 device was not found in the hard-coded data either. */
271 else if (!found_headings
272 && strncmp (line
, device_name_heading
,
273 strlen (device_name_heading
)) == 0)
276 char * heading
= strtok (line
, ",");
277 found_headings
= true;
278 /* Find which column MPY_TYPE and CPU_TYPE are in. */
279 while (heading
!= NULL
)
281 if (strncmp (heading
, cpu_type_heading
,
282 strlen (cpu_type_heading
)) == 0)
283 cpu_type_column
= curr_column
;
284 else if (strncmp (heading
, mpy_type_heading
,
285 strlen (mpy_type_heading
)) == 0)
286 mpy_type_column
= curr_column
;
287 if (cpu_type_column
!= -1 && mpy_type_column
!= -1)
289 heading
= strtok (NULL
, ",");
292 if (cpu_type_column
== -1 || mpy_type_column
== -1)
294 if (msp430_warn_devices_csv
)
296 if (cpu_type_column
== -1 && mpy_type_column
!= -1)
297 warning (0, "%<CPU_TYPE%> column heading is missing from "
299 else if (mpy_type_column
== -1 && cpu_type_column
!= -1)
300 warning (0, "%<MPY_TYPE%> column heading is missing from "
303 warning (0, "%<CPU_TYPE%> and %<MPY_TYPE%> column headings "
304 "are missing from %<devices.csv%>");
309 else if (strncasecmp (line
, mcu_name
, strlen (mcu_name
)) == 0
310 && *(line
+ strlen (mcu_name
)) == ',')
314 if (msp430_warn_devices_csv
)
315 warning (0, "format of column headings in %<devices.csv%> "
319 char * val
= strtok (line
, ",");
320 int final_col_num
= ((mpy_type_column
> cpu_type_column
)
321 ? mpy_type_column
: cpu_type_column
);
323 bool found_cpu
= false;
324 bool found_mpy
= false;
325 for (curr_col
= 0; curr_col
<= final_col_num
; curr_col
++)
327 /* Strip any new line characters from the last token. */
328 if (curr_col
== final_col_num
&& strlen (val
) > 1
329 /* ASCII digit 10 == LF, 13 == CR. */
330 && (val
[1] == 10 || val
[1] == 13))
332 /* Terminate the string after the first character. */
335 if (curr_col
== cpu_type_column
)
337 cpu_type
= atoi (val
);
338 /* Only a single '0', '1' or '2' is accepted. */
339 if (strlen (val
) != 1
340 /* atoi will return 0 if the string passed as an argument
341 is empty or contains only whitespace characters, so we
342 must error if 0 is returned but the first character in
343 the original string is not '0'. */
344 || (cpu_type
== 0 && val
[0] != '0')
345 || cpu_type
> 2 || cpu_type
< 0)
347 if (msp430_warn_devices_csv
)
348 warning (0, "invalid %<CPU_TYPE%> value of %qs read "
349 "from %<devices.csv%> for %qs", val
, mcu_name
);
352 extracted_mcu_data
.revision
= cpu_type
;
355 else if (curr_col
== mpy_type_column
)
357 mpy_type
= atoi (val
);
358 /* Only a single '0', '1', '2', '4' or '8' is accepted. */
359 if (strlen (val
) != 1
360 || (mpy_type
== 0 && val
[0] != '0')
367 if (msp430_warn_devices_csv
)
368 warning (0, "invalid %<MPY_TYPE%> value of %qs read "
369 "from %<devices.csv%> for %qs", val
, mcu_name
);
372 extracted_mcu_data
.hwmpy
= mpy_type
;
375 if (found_cpu
&& found_mpy
)
377 extracted_mcu_data
.name
= mcu_name
;
381 val
= strtok (NULL
, ",");
383 if (msp430_warn_devices_csv
&& (cpu_type
== -1 || mpy_type
== -1))
384 warning (0, "unknown error reading %s from "
386 (cpu_type
!= -1 ? "%<MPY_TYPE%>"
387 : (mpy_type
!= -1 ? "%<CPU_TYPE%>"
388 : "%<CPU_TYPE%> and %<MPY_TYPE%>")));
393 fclose (devices_file
);
399 /* Wrapper for the parse_devices_csv_1 work function.
400 A return code of 0 indicates that the MCU data has been successfully
401 extracted into extracted_mcu_data.
402 A return code of 1 indicates that the specified MCU wasn't found in
404 A return code of 2 indicates that devices.csv wasn't found at all. */
406 parse_devices_csv (const char * mcu_name
)
408 /* First check if the path to devices.csv was set by -mdevices-csv-loc. */
409 if (msp430_devices_csv_loc
!= NULL
)
410 return parse_devices_csv_1 (msp430_devices_csv_loc
, mcu_name
);
411 /* Otherwise check if the path to devices.csv was found another way. */
412 else if (derived_devices_csv_loc
!= NULL
)
413 return parse_devices_csv_1 (derived_devices_csv_loc
, mcu_name
);
414 /* Otherwise we need to use environment variables to try and find it. */
415 if (msp430_check_env_var_for_devices (&derived_devices_csv_loc
))
416 /* devices.csv was not found. */
418 return parse_devices_csv_1 (derived_devices_csv_loc
, mcu_name
);
421 /* Main entry point to load the MCU data for the given -mmcu into
423 First, the "devices.csv" MCU data file is searched for, if it is found, and
424 the MCU has a record in it, then that data is used.
425 Otherwise, hard_msp430_mcu_data (initialized at the bottom of this
426 file) is searched for the MCU name.
427 This function only needs to be executed once, but it can be first called
428 from a number of different locations. */
430 msp430_extract_mcu_data (const char * mcu_name
)
432 static int executed
= 0;
433 int devices_csv_not_found
= 0;
435 if (mcu_name
== NULL
|| executed
== 1)
438 /* If parse_devices_csv returns non-zero we need to use the
440 switch (parse_devices_csv (mcu_name
))
445 /* MCU not found in devices.csv. Warn later if it's not in the
446 hard-coded data either. */
449 devices_csv_not_found
= 1;
454 for (i
= ARRAY_SIZE (hard_msp430_mcu_data
); i
--;)
455 if (strcasecmp (mcu_name
, hard_msp430_mcu_data
[i
].name
) == 0)
457 extracted_mcu_data
= hard_msp430_mcu_data
[i
];
460 /* Validation checks. */
461 if (extracted_mcu_data
.name
!= NULL
)
463 switch (extracted_mcu_data
.hwmpy
)
471 error ("unrecognized %<hwmpy%> field in "
472 "%<hard_msp430_mcu_data[%d]%>: %qd", i
,
473 hard_msp430_mcu_data
[i
].hwmpy
);
476 switch (extracted_mcu_data
.revision
)
482 error ("unrecognized %<revision%> field in "
483 "%<hard_msp430_mcu_data[%d]%>: %qd", i
,
484 hard_msp430_mcu_data
[i
].revision
);
487 else if (msp430_warn_devices_csv
&& devices_csv_not_found
)
488 warning (0, "could not locate MCU data file %<devices.csv%>");
489 else if (msp430_warn_mcu
&& extracted_mcu_data
.name
== NULL
)
491 /* FIXME: We should warn here that the MCU name is unrecognized, but
492 msp430_option_override will warn about an unrecognized MCU as well.
493 The benefit of warning here is that this is code common to both the
494 driver and compiler proper, so a warning will be emitted when
495 assembling/linking via the driver, whilst msp430_option_override will
496 only be called when preprocessing or compiling. */
500 /* The data in this structure has been extracted from version 1.194 of the
501 devices.csv file released by TI in September 2016. */
503 struct t_msp430_mcu_data hard_msp430_mcu_data
[605] =
505 { "cc430f5123",2,8 },
506 { "cc430f5125",2,8 },
507 { "cc430f5133",2,8 },
508 { "cc430f5135",2,8 },
509 { "cc430f5137",2,8 },
510 { "cc430f5143",2,8 },
511 { "cc430f5145",2,8 },
512 { "cc430f5147",2,8 },
513 { "cc430f6125",2,8 },
514 { "cc430f6126",2,8 },
515 { "cc430f6127",2,8 },
516 { "cc430f6135",2,8 },
517 { "cc430f6137",2,8 },
518 { "cc430f6143",2,8 },
519 { "cc430f6145",2,8 },
520 { "cc430f6147",2,8 },
521 { "msp430afe221",0,2 },
522 { "msp430afe222",0,2 },
523 { "msp430afe223",0,2 },
524 { "msp430afe231",0,2 },
525 { "msp430afe232",0,2 },
526 { "msp430afe233",0,2 },
527 { "msp430afe251",0,2 },
528 { "msp430afe252",0,2 },
529 { "msp430afe253",0,2 },
530 { "msp430bt5190",2,8 },
531 { "msp430c091",0,0 },
532 { "msp430c092",0,0 },
533 { "msp430c111",0,0 },
534 { "msp430c1111",0,0 },
535 { "msp430c112",0,0 },
536 { "msp430c1121",0,0 },
537 { "msp430c1331",0,0 },
538 { "msp430c1351",0,0 },
539 { "msp430c311s",0,0 },
540 { "msp430c312",0,0 },
541 { "msp430c313",0,0 },
542 { "msp430c314",0,0 },
543 { "msp430c315",0,0 },
544 { "msp430c323",0,0 },
545 { "msp430c325",0,0 },
546 { "msp430c336",0,1 },
547 { "msp430c337",0,1 },
548 { "msp430c412",0,0 },
549 { "msp430c413",0,0 },
550 { "msp430cg4616",1,1 },
551 { "msp430cg4617",1,1 },
552 { "msp430cg4618",1,1 },
553 { "msp430cg4619",1,1 },
554 { "msp430e112",0,0 },
555 { "msp430e313",0,0 },
556 { "msp430e315",0,0 },
557 { "msp430e325",0,0 },
558 { "msp430e337",0,1 },
559 { "msp430f110",0,0 },
560 { "msp430f1101",0,0 },
561 { "msp430f1101a",0,0 },
562 { "msp430f1111",0,0 },
563 { "msp430f1111a",0,0 },
564 { "msp430f112",0,0 },
565 { "msp430f1121",0,0 },
566 { "msp430f1121a",0,0 },
567 { "msp430f1122",0,0 },
568 { "msp430f1132",0,0 },
569 { "msp430f122",0,0 },
570 { "msp430f1222",0,0 },
571 { "msp430f123",0,0 },
572 { "msp430f1232",0,0 },
573 { "msp430f133",0,0 },
574 { "msp430f135",0,0 },
575 { "msp430f147",0,1 },
576 { "msp430f1471",0,1 },
577 { "msp430f148",0,1 },
578 { "msp430f1481",0,1 },
579 { "msp430f149",0,1 },
580 { "msp430f1491",0,1 },
581 { "msp430f155",0,0 },
582 { "msp430f156",0,0 },
583 { "msp430f157",0,0 },
584 { "msp430f1610",0,1 },
585 { "msp430f1611",0,1 },
586 { "msp430f1612",0,1 },
587 { "msp430f167",0,1 },
588 { "msp430f168",0,1 },
589 { "msp430f169",0,1 },
590 { "msp430f2001",0,0 },
591 { "msp430f2002",0,0 },
592 { "msp430f2003",0,0 },
593 { "msp430f2011",0,0 },
594 { "msp430f2012",0,0 },
595 { "msp430f2013",0,0 },
596 { "msp430f2101",0,0 },
597 { "msp430f2111",0,0 },
598 { "msp430f2112",0,0 },
599 { "msp430f2121",0,0 },
600 { "msp430f2122",0,0 },
601 { "msp430f2131",0,0 },
602 { "msp430f2132",0,0 },
603 { "msp430f2232",0,0 },
604 { "msp430f2234",0,0 },
605 { "msp430f2252",0,0 },
606 { "msp430f2254",0,0 },
607 { "msp430f2272",0,0 },
608 { "msp430f2274",0,0 },
609 { "msp430f233",0,2 },
610 { "msp430f2330",0,2 },
611 { "msp430f235",0,2 },
612 { "msp430f2350",0,2 },
613 { "msp430f2370",0,2 },
614 { "msp430f2410",0,2 },
615 { "msp430f2416",1,2 },
616 { "msp430f2417",1,2 },
617 { "msp430f2418",1,2 },
618 { "msp430f2419",1,2 },
619 { "msp430f247",0,2 },
620 { "msp430f2471",0,2 },
621 { "msp430f248",0,2 },
622 { "msp430f2481",0,2 },
623 { "msp430f249",0,2 },
624 { "msp430f2491",0,2 },
625 { "msp430f2616",1,2 },
626 { "msp430f2617",1,2 },
627 { "msp430f2618",1,2 },
628 { "msp430f2619",1,2 },
629 { "msp430f412",0,0 },
630 { "msp430f413",0,0 },
631 { "msp430f4132",0,0 },
632 { "msp430f415",0,0 },
633 { "msp430f4152",0,0 },
634 { "msp430f417",0,0 },
635 { "msp430f423",0,1 },
636 { "msp430f423a",0,1 },
637 { "msp430f425",0,1 },
638 { "msp430f4250",0,0 },
639 { "msp430f425a",0,1 },
640 { "msp430f4260",0,0 },
641 { "msp430f427",0,1 },
642 { "msp430f4270",0,0 },
643 { "msp430f427a",0,1 },
644 { "msp430f435",0,0 },
645 { "msp430f4351",0,0 },
646 { "msp430f436",0,0 },
647 { "msp430f4361",0,0 },
648 { "msp430f437",0,0 },
649 { "msp430f4371",0,0 },
650 { "msp430f438",0,0 },
651 { "msp430f439",0,0 },
652 { "msp430f447",0,1 },
653 { "msp430f448",0,1 },
654 { "msp430f4481",0,1 },
655 { "msp430f449",0,1 },
656 { "msp430f4491",0,1 },
657 { "msp430f4616",1,1 },
658 { "msp430f46161",1,1 },
659 { "msp430f4617",1,1 },
660 { "msp430f46171",1,1 },
661 { "msp430f4618",1,1 },
662 { "msp430f46181",1,1 },
663 { "msp430f4619",1,1 },
664 { "msp430f46191",1,1 },
665 { "msp430f47126",1,4 },
666 { "msp430f47127",1,4 },
667 { "msp430f47163",1,4 },
668 { "msp430f47166",1,4 },
669 { "msp430f47167",1,4 },
670 { "msp430f47173",1,4 },
671 { "msp430f47176",1,4 },
672 { "msp430f47177",1,4 },
673 { "msp430f47183",1,4 },
674 { "msp430f47186",1,4 },
675 { "msp430f47187",1,4 },
676 { "msp430f47193",1,4 },
677 { "msp430f47196",1,4 },
678 { "msp430f47197",1,4 },
679 { "msp430f477",0,0 },
680 { "msp430f478",0,0 },
681 { "msp430f4783",0,4 },
682 { "msp430f4784",0,4 },
683 { "msp430f479",0,0 },
684 { "msp430f4793",0,4 },
685 { "msp430f4794",0,4 },
686 { "msp430f5131",2,8 },
687 { "msp430f5132",2,8 },
688 { "msp430f5151",2,8 },
689 { "msp430f5152",2,8 },
690 { "msp430f5171",2,8 },
691 { "msp430f5172",2,8 },
692 { "msp430f5212",2,8 },
693 { "msp430f5213",2,8 },
694 { "msp430f5214",2,8 },
695 { "msp430f5217",2,8 },
696 { "msp430f5218",2,8 },
697 { "msp430f5219",2,8 },
698 { "msp430f5222",2,8 },
699 { "msp430f5223",2,8 },
700 { "msp430f5224",2,8 },
701 { "msp430f5227",2,8 },
702 { "msp430f5228",2,8 },
703 { "msp430f5229",2,8 },
704 { "msp430f5232",2,8 },
705 { "msp430f5234",2,8 },
706 { "msp430f5237",2,8 },
707 { "msp430f5239",2,8 },
708 { "msp430f5242",2,8 },
709 { "msp430f5244",2,8 },
710 { "msp430f5247",2,8 },
711 { "msp430f5249",2,8 },
712 { "msp430f5252",2,8 },
713 { "msp430f5253",2,8 },
714 { "msp430f5254",2,8 },
715 { "msp430f5255",2,8 },
716 { "msp430f5256",2,8 },
717 { "msp430f5257",2,8 },
718 { "msp430f5258",2,8 },
719 { "msp430f5259",2,8 },
720 { "msp430f5304",2,8 },
721 { "msp430f5308",2,8 },
722 { "msp430f5309",2,8 },
723 { "msp430f5310",2,8 },
724 { "msp430f5324",2,8 },
725 { "msp430f5325",2,8 },
726 { "msp430f5326",2,8 },
727 { "msp430f5327",2,8 },
728 { "msp430f5328",2,8 },
729 { "msp430f5329",2,8 },
730 { "msp430f5333",2,8 },
731 { "msp430f5335",2,8 },
732 { "msp430f5336",2,8 },
733 { "msp430f5338",2,8 },
734 { "msp430f5340",2,8 },
735 { "msp430f5341",2,8 },
736 { "msp430f5342",2,8 },
737 { "msp430f5358",2,8 },
738 { "msp430f5359",2,8 },
739 { "msp430f5418",2,8 },
740 { "msp430f5418a",2,8 },
741 { "msp430f5419",2,8 },
742 { "msp430f5419a",2,8 },
743 { "msp430f5435",2,8 },
744 { "msp430f5435a",2,8 },
745 { "msp430f5436",2,8 },
746 { "msp430f5436a",2,8 },
747 { "msp430f5437",2,8 },
748 { "msp430f5437a",2,8 },
749 { "msp430f5438",2,8 },
750 { "msp430f5438a",2,8 },
751 { "msp430f5500",2,8 },
752 { "msp430f5501",2,8 },
753 { "msp430f5502",2,8 },
754 { "msp430f5503",2,8 },
755 { "msp430f5504",2,8 },
756 { "msp430f5505",2,8 },
757 { "msp430f5506",2,8 },
758 { "msp430f5507",2,8 },
759 { "msp430f5508",2,8 },
760 { "msp430f5509",2,8 },
761 { "msp430f5510",2,8 },
762 { "msp430f5513",2,8 },
763 { "msp430f5514",2,8 },
764 { "msp430f5515",2,8 },
765 { "msp430f5517",2,8 },
766 { "msp430f5519",2,8 },
767 { "msp430f5521",2,8 },
768 { "msp430f5522",2,8 },
769 { "msp430f5524",2,8 },
770 { "msp430f5525",2,8 },
771 { "msp430f5526",2,8 },
772 { "msp430f5527",2,8 },
773 { "msp430f5528",2,8 },
774 { "msp430f5529",2,8 },
775 { "msp430f5630",2,8 },
776 { "msp430f5631",2,8 },
777 { "msp430f5632",2,8 },
778 { "msp430f5633",2,8 },
779 { "msp430f5634",2,8 },
780 { "msp430f5635",2,8 },
781 { "msp430f5636",2,8 },
782 { "msp430f5637",2,8 },
783 { "msp430f5638",2,8 },
784 { "msp430f5658",2,8 },
785 { "msp430f5659",2,8 },
786 { "msp430f5xx_6xxgeneric",2,8 },
787 { "msp430f6433",2,8 },
788 { "msp430f6435",2,8 },
789 { "msp430f6436",2,8 },
790 { "msp430f6438",2,8 },
791 { "msp430f6458",2,8 },
792 { "msp430f6459",2,8 },
793 { "msp430f6630",2,8 },
794 { "msp430f6631",2,8 },
795 { "msp430f6632",2,8 },
796 { "msp430f6633",2,8 },
797 { "msp430f6634",2,8 },
798 { "msp430f6635",2,8 },
799 { "msp430f6636",2,8 },
800 { "msp430f6637",2,8 },
801 { "msp430f6638",2,8 },
802 { "msp430f6658",2,8 },
803 { "msp430f6659",2,8 },
804 { "msp430f6720",2,8 },
805 { "msp430f6720a",2,8 },
806 { "msp430f6721",2,8 },
807 { "msp430f6721a",2,8 },
808 { "msp430f6723",2,8 },
809 { "msp430f6723a",2,8 },
810 { "msp430f6724",2,8 },
811 { "msp430f6724a",2,8 },
812 { "msp430f6725",2,8 },
813 { "msp430f6725a",2,8 },
814 { "msp430f6726",2,8 },
815 { "msp430f6726a",2,8 },
816 { "msp430f6730",2,8 },
817 { "msp430f6730a",2,8 },
818 { "msp430f6731",2,8 },
819 { "msp430f6731a",2,8 },
820 { "msp430f6733",2,8 },
821 { "msp430f6733a",2,8 },
822 { "msp430f6734",2,8 },
823 { "msp430f6734a",2,8 },
824 { "msp430f6735",2,8 },
825 { "msp430f6735a",2,8 },
826 { "msp430f6736",2,8 },
827 { "msp430f6736a",2,8 },
828 { "msp430f6745",2,8 },
829 { "msp430f67451",2,8 },
830 { "msp430f67451a",2,8 },
831 { "msp430f6745a",2,8 },
832 { "msp430f6746",2,8 },
833 { "msp430f67461",2,8 },
834 { "msp430f67461a",2,8 },
835 { "msp430f6746a",2,8 },
836 { "msp430f6747",2,8 },
837 { "msp430f67471",2,8 },
838 { "msp430f67471a",2,8 },
839 { "msp430f6747a",2,8 },
840 { "msp430f6748",2,8 },
841 { "msp430f67481",2,8 },
842 { "msp430f67481a",2,8 },
843 { "msp430f6748a",2,8 },
844 { "msp430f6749",2,8 },
845 { "msp430f67491",2,8 },
846 { "msp430f67491a",2,8 },
847 { "msp430f6749a",2,8 },
848 { "msp430f67621",2,8 },
849 { "msp430f67621a",2,8 },
850 { "msp430f67641",2,8 },
851 { "msp430f67641a",2,8 },
852 { "msp430f6765",2,8 },
853 { "msp430f67651",2,8 },
854 { "msp430f67651a",2,8 },
855 { "msp430f6765a",2,8 },
856 { "msp430f6766",2,8 },
857 { "msp430f67661",2,8 },
858 { "msp430f67661a",2,8 },
859 { "msp430f6766a",2,8 },
860 { "msp430f6767",2,8 },
861 { "msp430f67671",2,8 },
862 { "msp430f67671a",2,8 },
863 { "msp430f6767a",2,8 },
864 { "msp430f6768",2,8 },
865 { "msp430f67681",2,8 },
866 { "msp430f67681a",2,8 },
867 { "msp430f6768a",2,8 },
868 { "msp430f6769",2,8 },
869 { "msp430f67691",2,8 },
870 { "msp430f67691a",2,8 },
871 { "msp430f6769a",2,8 },
872 { "msp430f6775",2,8 },
873 { "msp430f67751",2,8 },
874 { "msp430f67751a",2,8 },
875 { "msp430f6775a",2,8 },
876 { "msp430f6776",2,8 },
877 { "msp430f67761",2,8 },
878 { "msp430f67761a",2,8 },
879 { "msp430f6776a",2,8 },
880 { "msp430f6777",2,8 },
881 { "msp430f67771",2,8 },
882 { "msp430f67771a",2,8 },
883 { "msp430f6777a",2,8 },
884 { "msp430f6778",2,8 },
885 { "msp430f67781",2,8 },
886 { "msp430f67781a",2,8 },
887 { "msp430f6778a",2,8 },
888 { "msp430f6779",2,8 },
889 { "msp430f67791",2,8 },
890 { "msp430f67791a",2,8 },
891 { "msp430f6779a",2,8 },
892 { "msp430fe423",0,0 },
893 { "msp430fe4232",0,0 },
894 { "msp430fe423a",0,0 },
895 { "msp430fe4242",0,0 },
896 { "msp430fe425",0,0 },
897 { "msp430fe4252",0,0 },
898 { "msp430fe425a",0,0 },
899 { "msp430fe427",0,0 },
900 { "msp430fe4272",0,0 },
901 { "msp430fe427a",0,0 },
902 { "msp430fg4250",0,0 },
903 { "msp430fg4260",0,0 },
904 { "msp430fg4270",0,0 },
905 { "msp430fg437",0,0 },
906 { "msp430fg438",0,0 },
907 { "msp430fg439",0,0 },
908 { "msp430fg4616",1,1 },
909 { "msp430fg4617",1,1 },
910 { "msp430fg4618",1,1 },
911 { "msp430fg4619",1,1 },
912 { "msp430fg477",0,0 },
913 { "msp430fg478",0,0 },
914 { "msp430fg479",0,0 },
915 { "msp430fg6425",2,8 },
916 { "msp430fg6426",2,8 },
917 { "msp430fg6625",2,8 },
918 { "msp430fg6626",2,8 },
919 { "msp430fr2032",2,0 },
920 { "msp430fr2033",2,0 },
921 { "msp430fr2110",2,0 },
922 { "msp430fr2111",2,0 },
923 { "msp430fr2310",2,0 },
924 { "msp430fr2311",2,0 },
925 { "msp430fr2433",2,8 },
926 { "msp430fr2532",2,8 },
927 { "msp430fr2533",2,8 },
928 { "msp430fr2632",2,8 },
929 { "msp430fr2633",2,8 },
930 { "msp430fr2xx_4xxgeneric",2,8 },
931 { "msp430fr4131",2,0 },
932 { "msp430fr4132",2,0 },
933 { "msp430fr4133",2,0 },
934 { "msp430fr5720",2,8 },
935 { "msp430fr5721",2,8 },
936 { "msp430fr5722",2,8 },
937 { "msp430fr5723",2,8 },
938 { "msp430fr5724",2,8 },
939 { "msp430fr5725",2,8 },
940 { "msp430fr5726",2,8 },
941 { "msp430fr5727",2,8 },
942 { "msp430fr5728",2,8 },
943 { "msp430fr5729",2,8 },
944 { "msp430fr5730",2,8 },
945 { "msp430fr5731",2,8 },
946 { "msp430fr5732",2,8 },
947 { "msp430fr5733",2,8 },
948 { "msp430fr5734",2,8 },
949 { "msp430fr5735",2,8 },
950 { "msp430fr5736",2,8 },
951 { "msp430fr5737",2,8 },
952 { "msp430fr5738",2,8 },
953 { "msp430fr5739",2,8 },
954 { "msp430fr57xxgeneric",2,8 },
955 { "msp430fr5847",2,8 },
956 { "msp430fr58471",2,8 },
957 { "msp430fr5848",2,8 },
958 { "msp430fr5849",2,8 },
959 { "msp430fr5857",2,8 },
960 { "msp430fr5858",2,8 },
961 { "msp430fr5859",2,8 },
962 { "msp430fr5867",2,8 },
963 { "msp430fr58671",2,8 },
964 { "msp430fr5868",2,8 },
965 { "msp430fr5869",2,8 },
966 { "msp430fr5870",2,8 },
967 { "msp430fr5872",2,8 },
968 { "msp430fr58721",2,8 },
969 { "msp430fr5887",2,8 },
970 { "msp430fr5888",2,8 },
971 { "msp430fr5889",2,8 },
972 { "msp430fr58891",2,8 },
973 { "msp430fr5922",2,8 },
974 { "msp430fr59221",2,8 },
975 { "msp430fr5947",2,8 },
976 { "msp430fr59471",2,8 },
977 { "msp430fr5948",2,8 },
978 { "msp430fr5949",2,8 },
979 { "msp430fr5957",2,8 },
980 { "msp430fr5958",2,8 },
981 { "msp430fr5959",2,8 },
982 { "msp430fr5962",2,8 },
983 { "msp430fr5964",2,8 },
984 { "msp430fr5967",2,8 },
985 { "msp430fr5968",2,8 },
986 { "msp430fr5969",2,8 },
987 { "msp430fr59691",2,8 },
988 { "msp430fr5970",2,8 },
989 { "msp430fr5972",2,8 },
990 { "msp430fr59721",2,8 },
991 { "msp430fr5986",2,8 },
992 { "msp430fr5987",2,8 },
993 { "msp430fr5988",2,8 },
994 { "msp430fr5989",2,8 },
995 { "msp430fr59891",2,8 },
996 { "msp430fr5992",2,8 },
997 { "msp430fr5994",2,8 },
998 { "msp430fr59941",2,8 },
999 { "msp430fr5xx_6xxgeneric",2,8 },
1000 { "msp430fr6820",2,8 },
1001 { "msp430fr6822",2,8 },
1002 { "msp430fr68221",2,8 },
1003 { "msp430fr6870",2,8 },
1004 { "msp430fr6872",2,8 },
1005 { "msp430fr68721",2,8 },
1006 { "msp430fr6877",2,8 },
1007 { "msp430fr6879",2,8 },
1008 { "msp430fr68791",2,8 },
1009 { "msp430fr6887",2,8 },
1010 { "msp430fr6888",2,8 },
1011 { "msp430fr6889",2,8 },
1012 { "msp430fr68891",2,8 },
1013 { "msp430fr6920",2,8 },
1014 { "msp430fr6922",2,8 },
1015 { "msp430fr69221",2,8 },
1016 { "msp430fr6927",2,8 },
1017 { "msp430fr69271",2,8 },
1018 { "msp430fr6928",2,8 },
1019 { "msp430fr6970",2,8 },
1020 { "msp430fr6972",2,8 },
1021 { "msp430fr69721",2,8 },
1022 { "msp430fr6977",2,8 },
1023 { "msp430fr6979",2,8 },
1024 { "msp430fr69791",2,8 },
1025 { "msp430fr6987",2,8 },
1026 { "msp430fr6988",2,8 },
1027 { "msp430fr6989",2,8 },
1028 { "msp430fr69891",2,8 },
1029 { "msp430fw423",0,0 },
1030 { "msp430fw425",0,0 },
1031 { "msp430fw427",0,0 },
1032 { "msp430fw428",0,0 },
1033 { "msp430fw429",0,0 },
1034 { "msp430g2001",0,0 },
1035 { "msp430g2101",0,0 },
1036 { "msp430g2102",0,0 },
1037 { "msp430g2111",0,0 },
1038 { "msp430g2112",0,0 },
1039 { "msp430g2113",0,0 },
1040 { "msp430g2121",0,0 },
1041 { "msp430g2131",0,0 },
1042 { "msp430g2132",0,0 },
1043 { "msp430g2152",0,0 },
1044 { "msp430g2153",0,0 },
1045 { "msp430g2201",0,0 },
1046 { "msp430g2202",0,0 },
1047 { "msp430g2203",0,0 },
1048 { "msp430g2210",0,0 },
1049 { "msp430g2211",0,0 },
1050 { "msp430g2212",0,0 },
1051 { "msp430g2213",0,0 },
1052 { "msp430g2221",0,0 },
1053 { "msp430g2230",0,0 },
1054 { "msp430g2231",0,0 },
1055 { "msp430g2232",0,0 },
1056 { "msp430g2233",0,0 },
1057 { "msp430g2252",0,0 },
1058 { "msp430g2253",0,0 },
1059 { "msp430g2302",0,0 },
1060 { "msp430g2303",0,0 },
1061 { "msp430g2312",0,0 },
1062 { "msp430g2313",0,0 },
1063 { "msp430g2332",0,0 },
1064 { "msp430g2333",0,0 },
1065 { "msp430g2352",0,0 },
1066 { "msp430g2353",0,0 },
1067 { "msp430g2402",0,0 },
1068 { "msp430g2403",0,0 },
1069 { "msp430g2412",0,0 },
1070 { "msp430g2413",0,0 },
1071 { "msp430g2432",0,0 },
1072 { "msp430g2433",0,0 },
1073 { "msp430g2444",0,0 },
1074 { "msp430g2452",0,0 },
1075 { "msp430g2453",0,0 },
1076 { "msp430g2513",0,0 },
1077 { "msp430g2533",0,0 },
1078 { "msp430g2544",0,0 },
1079 { "msp430g2553",0,0 },
1080 { "msp430g2744",0,0 },
1081 { "msp430g2755",0,0 },
1082 { "msp430g2855",0,0 },
1083 { "msp430g2955",0,0 },
1084 { "msp430i2020",0,2 },
1085 { "msp430i2021",0,2 },
1086 { "msp430i2030",0,2 },
1087 { "msp430i2031",0,2 },
1088 { "msp430i2040",0,2 },
1089 { "msp430i2041",0,2 },
1090 { "msp430i2xxgeneric",0,2 },
1091 { "msp430l092",0,0 },
1092 { "msp430p112",0,0 },
1093 { "msp430p313",0,0 },
1094 { "msp430p315",0,0 },
1095 { "msp430p315s",0,0 },
1096 { "msp430p325",0,0 },
1097 { "msp430p337",0,1 },
1098 { "msp430sl5438a",2,8 },
1099 { "msp430tch5e",0,0 },
1100 { "msp430xgeneric",2,8 },
1101 { "rf430f5144",2,8 },
1102 { "rf430f5155",2,8 },
1103 { "rf430f5175",2,8 },
1104 { "rf430frl152h",0,0 },
1105 { "rf430frl152h_rom",0,0 },
1106 { "rf430frl153h",0,0 },
1107 { "rf430frl153h_rom",0,0 },
1108 { "rf430frl154h",0,0 },
1109 { "rf430frl154h_rom",0,0 }