xref: /btstack/tool/metrics/metrics-lizard.py (revision 38e38f23346dd994332952caf7440f1475b74340)
1*38e38f23SMatthias Ringwald#!/usr/bin/env python3
2*38e38f23SMatthias Ringwald
3*38e38f23SMatthias Ringwald# requires https://github.com/terryyin/lizard
4*38e38f23SMatthias Ringwald
5*38e38f23SMatthias Ringwaldimport lizard
6*38e38f23SMatthias Ringwaldimport os
7*38e38f23SMatthias Ringwaldimport sys
8*38e38f23SMatthias Ringwald
9*38e38f23SMatthias Ringwaldfolders = [
10*38e38f23SMatthias Ringwald'src',
11*38e38f23SMatthias Ringwald'src/ble',
12*38e38f23SMatthias Ringwald'src/ble/gatt-service',
13*38e38f23SMatthias Ringwald'src/classic',
14*38e38f23SMatthias Ringwald]
15*38e38f23SMatthias Ringwald
16*38e38f23SMatthias Ringwaldmetrics = {}
17*38e38f23SMatthias Ringwaldtargets = {}
18*38e38f23SMatthias Ringwald
19*38e38f23SMatthias Ringwaldtargets['CCN']   = 10
20*38e38f23SMatthias Ringwaldtargets['PARAM'] = 7
21*38e38f23SMatthias Ringwald
22*38e38f23SMatthias Ringwalddef metric_count(name):
23*38e38f23SMatthias Ringwald    global metrics
24*38e38f23SMatthias Ringwald    value = 0
25*38e38f23SMatthias Ringwald    if name in metrics:
26*38e38f23SMatthias Ringwald        value = metrics[name]
27*38e38f23SMatthias Ringwald    metrics[name] = value + 1
28*38e38f23SMatthias Ringwald
29*38e38f23SMatthias Ringwald
30*38e38f23SMatthias Ringwalddef metric_list(name, item):
31*38e38f23SMatthias Ringwald    global metrics
32*38e38f23SMatthias Ringwald    value = []
33*38e38f23SMatthias Ringwald    if name in metrics:
34*38e38f23SMatthias Ringwald        value = metrics[name]
35*38e38f23SMatthias Ringwald    value.append(item)
36*38e38f23SMatthias Ringwald    metrics[name] = value
37*38e38f23SMatthias Ringwald
38*38e38f23SMatthias Ringwalddef metric_max(name, max):
39*38e38f23SMatthias Ringwald    global metrics
40*38e38f23SMatthias Ringwald    if name in metrics:
41*38e38f23SMatthias Ringwald        if metrics[name] > max:
42*38e38f23SMatthias Ringwald            return
43*38e38f23SMatthias Ringwald    metrics[name] = max
44*38e38f23SMatthias Ringwald
45*38e38f23SMatthias Ringwalddef metric_measure(metric_name, functino_name, actual):
46*38e38f23SMatthias Ringwald    metric_max(metric_name + '_MAX', actual)
47*38e38f23SMatthias Ringwald    if metric_name in targets:
48*38e38f23SMatthias Ringwald        if actual > targets[metric_name]:
49*38e38f23SMatthias Ringwald            metric_count(metric_name + '_DEVIATIONS')
50*38e38f23SMatthias Ringwald            metric_list(metric_name + '_LIST', functino_name)
51*38e38f23SMatthias Ringwald
52*38e38f23SMatthias Ringwalddef analyze_file(path):
53*38e38f23SMatthias Ringwald    l = lizard.analyze_file(path)
54*38e38f23SMatthias Ringwald    for f in l.function_list:
55*38e38f23SMatthias Ringwald        metric_count('FUNC')
56*38e38f23SMatthias Ringwald        metric_measure('PARAM', f.name, f.parameter_count)
57*38e38f23SMatthias Ringwald        metric_measure('CCN',   f.name, f.cyclomatic_complexity )
58*38e38f23SMatthias Ringwald
59*38e38f23SMatthias Ringwalddef analyze_folder(folder_path):
60*38e38f23SMatthias Ringwald    for file in sorted(os.listdir(folder_path)):
61*38e38f23SMatthias Ringwald        if file.endswith(".c"):
62*38e38f23SMatthias Ringwald            analyze_file(folder_path+'/'+file)
63*38e38f23SMatthias Ringwald
64*38e38f23SMatthias Ringwald# find root
65*38e38f23SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../..')
66*38e38f23SMatthias Ringwald
67*38e38f23SMatthias Ringwaldprint ("Targets:")
68*38e38f23SMatthias Ringwaldfor key,value in sorted(targets.items()):
69*38e38f23SMatthias Ringwald    print ('- %-20s: %u' % (key, value))
70*38e38f23SMatthias Ringwald
71*38e38f23SMatthias Ringwaldprint ("\nAnalyzing:")
72*38e38f23SMatthias Ringwaldfor path in folders:
73*38e38f23SMatthias Ringwald    print('- %s' % path)
74*38e38f23SMatthias Ringwald    analyze_folder(btstack_root + "/" + path)
75*38e38f23SMatthias Ringwald
76*38e38f23SMatthias Ringwaldprint ("\nResult:")
77*38e38f23SMatthias Ringwald
78*38e38f23SMatthias Ringwaldfor key,value in sorted(metrics.items()):
79*38e38f23SMatthias Ringwald    if key.endswith('LIST'):
80*38e38f23SMatthias Ringwald        continue
81*38e38f23SMatthias Ringwald    print ('- %-20s: %4u' % (key, value))
82*38e38f23SMatthias Ringwald
83*38e38f23SMatthias Ringwaldfor key,value in sorted(metrics.items()):
84*38e38f23SMatthias Ringwald    if not key.endswith('LIST'):
85*38e38f23SMatthias Ringwald        continue
86*38e38f23SMatthias Ringwald    print ("\n%s" % key)
87*38e38f23SMatthias Ringwald    print ('\n'.join(value))
88*38e38f23SMatthias Ringwald
89