1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#!/usr/bin/env python
"""
MPN structure:
STM32F101RB
STM32F1 01 R B
{family} {subfamily} {package} {memory}
"""
import json
import csv
ALL_FILE = "stm32_all_20130509.csv"
PREFIXES = [
'STM32F0',
'STM32F1',
'STM32F2',
'STM32F3',
'STM32L',
'STM32W',
]
def decompose(mpn):
"returns (family, subfamily, memory, package"
return mpn[:7], mpn[7:9], mpn[9], mpn[10]
def ensure_recurse_dict(tree, addr):
if not tree.has_key(addr[0]):
tree[addr[0]] = dict()
if len(addr) > 1:
ensure_recurse_dict(tree[addr[0]], addr[1:])
def identical(l):
a = l[0]
for b in l[1:]:
if a != b:
return False
return True
stm32_all_list = []
with open(ALL_FILE, 'r') as f:
dr = csv.DictReader(f)
stm32_all_list.extend(dr)
for item in stm32_all_list:
item['mpn'] = item.pop("Part Number")
lists = dict()
for pref in PREFIXES:
lists[pref] = [x for x in stm32_all_list if x['mpn'].startswith(pref)]
print "%s:" % pref
print '\t' + '\n\t'.join([x['mpn'] for x in lists[pref]])
family = lists[PREFIXES[1]]
# strip common specifications
family_specs = dict()
for spec in family[0].keys():
if identical([x[spec] for x in family]):
family_specs[spec] = family[0][spec]
[item.pop(spec) for item in family]
print family_specs
tree = dict()
for part in family:
addr = decompose(part['mpn'])
#ensure_recurse_dict(tree, addr)
#tree[addr[0]][addr[1]][addr[2]][addr[3]] = part
ensure_recurse_dict(tree, addr[1:])
tree[addr[1]][addr[2]][addr[3]] = part
print sorted(tree.keys())
for subfamily in tree.items():
subfamily_keys = part.keys()
subfamily_keys.remove('mpn')
for spec in subfamily_keys:
subfamily_items =
if not identical([x[spec] for x in [pkg.items() for pkg in [mem.items() for mem in subfamily.items()]]]):
subfamily_keys.remove(spec)
print subfamily_keys
def combine(tree, depth):
if depth:
combinel(
|