@modular-circuit/perc 0.0.58 → 0.0.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/erc/netlist/constraints.js +3 -3
- package/build/erc/netlist/tester.js +27 -50
- package/build/erc/parameter_propagation/error_code.js +33 -34
- package/build/erc/parameter_propagation/link_testers/link_tester_base.js +27 -100
- package/build/erc/parameter_propagation/link_testers/tester_impl.js +424 -886
- package/build/erc/parameter_propagation/tester.js +123 -191
- package/build/erc/pin_compatibility_matrix/erc_setting.js +72 -74
- package/build/erc/pin_compatibility_matrix/tester.js +12 -13
- package/build/report/erc_report.js +5 -6
- package/build/report/erc_reporter.js +49 -49
- package/build/tester/erc_tester.js +19 -57
- package/build/tester/graph/connection_graphs_builder.js +75 -163
- package/build/tester/graph/graph_erc.js +7 -59
- package/build/tester/graph/ir_graph_converter.js +112 -253
- package/build/utils/get_dependent_modules_definition.js +14 -141
- package/package.json +4 -4
|
@@ -15,7 +15,7 @@ import { ELECTRICAL_PINTYPE } from '@modular-circuit/electronics-model';
|
|
|
15
15
|
// List of pin types that are considered drivers for usual input pins
|
|
16
16
|
// i.e. pin type = ELECTRICAL_PINTYPE::PT_INPUT, but not PT_POWER_IN
|
|
17
17
|
// that need only a PT_POWER_OUT pin type to be driven
|
|
18
|
-
export
|
|
18
|
+
export const DrivingPinTypes = new Set([
|
|
19
19
|
ELECTRICAL_PINTYPE.PT_OUTPUT,
|
|
20
20
|
ELECTRICAL_PINTYPE.PT_POWER_OUT,
|
|
21
21
|
ELECTRICAL_PINTYPE.PT_PASSIVE,
|
|
@@ -25,6 +25,6 @@ export var DrivingPinTypes = new Set([
|
|
|
25
25
|
// List of pin types that are considered drivers for power pins
|
|
26
26
|
// In fact only a ELECTRICAL_PINTYPE::PT_POWER_OUT pin type can drive
|
|
27
27
|
// power input pins
|
|
28
|
-
export
|
|
28
|
+
export const PowerDrivingPinTypes = new Set([ELECTRICAL_PINTYPE.PT_POWER_OUT]);
|
|
29
29
|
// List of pin types that require a driver elsewhere on the net
|
|
30
|
-
export
|
|
30
|
+
export const DrivenPinTypes = new Set([ELECTRICAL_PINTYPE.PT_INPUT, ELECTRICAL_PINTYPE.PT_POWER_IN]);
|
|
@@ -1,67 +1,44 @@
|
|
|
1
|
-
var __values = (this && this.__values) || function(o) {
|
|
2
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
3
|
-
if (m) return m.call(o);
|
|
4
|
-
if (o && typeof o.length === "number") return {
|
|
5
|
-
next: function () {
|
|
6
|
-
if (o && i >= o.length) o = void 0;
|
|
7
|
-
return { value: o && o[i++], done: !o };
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
11
|
-
};
|
|
12
1
|
import { ConnectionNodeType } from '@modular-circuit/electronics-model';
|
|
13
2
|
import { ERCE_DRIVER_CONFLICT, ERCE_PIN_NOT_CONNECTED } from '../../report';
|
|
14
|
-
|
|
15
|
-
|
|
3
|
+
export class NetlistTester {
|
|
4
|
+
ctx;
|
|
5
|
+
constructor(ctx) {
|
|
16
6
|
this.ctx = ctx;
|
|
17
7
|
}
|
|
18
|
-
|
|
8
|
+
visit_cc(cc) {
|
|
19
9
|
if (cc.nodes.length === 1 && cc.nodes[0].type === ConnectionNodeType.Port) {
|
|
20
10
|
this.ctx.report.erc_errors.push(ERCE_PIN_NOT_CONNECTED(cc.nodes[0].uuid));
|
|
21
11
|
return;
|
|
22
12
|
}
|
|
23
13
|
this.ercCheckMultipleDrivers(cc);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
var e_1, _a;
|
|
14
|
+
}
|
|
15
|
+
ercCheckMultipleDrivers(cc) {
|
|
27
16
|
if (!cc.net_drivers)
|
|
28
17
|
return;
|
|
29
|
-
|
|
18
|
+
const node_map = cc.nodes.reduce((map, node) => {
|
|
30
19
|
map[node.uuid] = node;
|
|
31
20
|
return map;
|
|
32
21
|
}, {});
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
22
|
+
for (const driver of cc.net_drivers.drivers) {
|
|
23
|
+
if (driver === cc.net_drivers.primary_driver)
|
|
24
|
+
continue;
|
|
25
|
+
const node = node_map[driver];
|
|
26
|
+
const net_name = cc.name;
|
|
27
|
+
switch (node.type) {
|
|
28
|
+
case ConnectionNodeType.Port:
|
|
29
|
+
case ConnectionNodeType.Graphics:
|
|
30
|
+
break;
|
|
31
|
+
case ConnectionNodeType.NetLabel:
|
|
32
|
+
if (net_name !== node.text) {
|
|
33
|
+
this.ctx.report.erc_errors.push(ERCE_DRIVER_CONFLICT([cc.net_drivers.primary_driver, driver], cc.name, node.text));
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
case ConnectionNodeType.Power:
|
|
37
|
+
if (net_name !== node.value) {
|
|
38
|
+
this.ctx.report.erc_errors.push(ERCE_DRIVER_CONFLICT([cc.net_drivers.primary_driver, driver], cc.name, node.value));
|
|
48
39
|
break;
|
|
49
|
-
|
|
50
|
-
if (net_name !== node.value) {
|
|
51
|
-
this.ctx.report.erc_errors.push(ERCE_DRIVER_CONFLICT([cc.net_drivers.primary_driver, driver], cc.name, node.value));
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
40
|
+
}
|
|
55
41
|
}
|
|
56
42
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
61
|
-
}
|
|
62
|
-
finally { if (e_1) throw e_1.error; }
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
return NetlistTester;
|
|
66
|
-
}());
|
|
67
|
-
export { NetlistTester };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* See https://github.com/BerkeleyHCI/PolymorphicBlocks/blob/master/compiler/src/main/scala/edg/compiler/CompilerError.scala
|
|
5
5
|
*/
|
|
6
|
-
var _a;
|
|
7
6
|
import { SEVERITY } from '../context';
|
|
8
7
|
export var PP_ERROR;
|
|
9
8
|
(function (PP_ERROR) {
|
|
@@ -39,36 +38,36 @@ export var PP_ERROR;
|
|
|
39
38
|
PP_ERROR["REQUIRES_CONNECTED_SOURCE_OR_BIDIR"] = "requires_connected_source_or_bidir";
|
|
40
39
|
PP_ERROR["ILLEGAL_CONNECTION"] = "Illegal_connection";
|
|
41
40
|
})(PP_ERROR || (PP_ERROR = {}));
|
|
42
|
-
export
|
|
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
|
-
|
|
41
|
+
export const DEFAULT_PP_ERROR_SEVERITY = {
|
|
42
|
+
[PP_ERROR.UN_COMPILED_BLOCK]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
43
|
+
[PP_ERROR.UN_COMPILED_LINK]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
44
|
+
[PP_ERROR.UN_COMPILED_LINK_ARRAY]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
45
|
+
[PP_ERROR.UN_COMPILED_PARAMETER]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
46
|
+
[PP_ERROR.UN_COMPILED_INTERNAL_ELEMENT]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
47
|
+
[PP_ERROR.UN_COMPILED_LIBRARY_ELEMENT]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
48
|
+
[PP_ERROR.UNDEFINED_PORT_ARRAY]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
49
|
+
[PP_ERROR.LIBRARY_ERROR]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
50
|
+
[PP_ERROR.GENERATOR_ERROR]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
51
|
+
[PP_ERROR.REFINEMENT_SUBCLASS_ERROR]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
52
|
+
[PP_ERROR.OVER_ASSIGN]: SEVERITY.RPT_SEVERITY_ERROR,
|
|
53
|
+
[PP_ERROR.BAD_REFERENCE]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
54
|
+
[PP_ERROR.ABSTRACT_BLOCK]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
55
|
+
[PP_ERROR.FAILED_ASSERTION]: SEVERITY.RPT_SEVERITY_ERROR,
|
|
56
|
+
[PP_ERROR.UN_EVALUATED_ASSERTION]: SEVERITY.RPT_SEVERITY_ERROR,
|
|
57
|
+
[PP_ERROR.INCONSISTENT_LINK_ARRAY_ELEMENTS]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
58
|
+
[PP_ERROR.PP_UNANNOTATED]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
59
|
+
[PP_ERROR.PP_UNKNOWN_PORT_TYPE]: SEVERITY.RPT_SEVERITY_ERROR,
|
|
60
|
+
[PP_ERROR.INAPPROPRIATE_FUNC]: SEVERITY.RPT_SEVERITY_ERROR,
|
|
61
|
+
[PP_ERROR.NOT_DRIVEN]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
62
|
+
[PP_ERROR.DUPLICATED_PWR_SOURCES]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
63
|
+
[PP_ERROR.INSUFFICIENT_DRIVER]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
64
|
+
[PP_ERROR.OVER_DRIVEN]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
65
|
+
[PP_ERROR.IMPEDANCE_SIGNAL_INTEGRITY]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
66
|
+
[PP_ERROR.INCOMPATIBLE_VOLTAGE_LEVELS]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
67
|
+
[PP_ERROR.SIGNAL_LEVELS_NOT_CONTAINED_WITHIN_VOLTAGE]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
68
|
+
[PP_ERROR.INCOMPATIBLE_SIGNAL_LEVELS]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
69
|
+
[PP_ERROR.OVERCURRENT]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
70
|
+
[PP_ERROR.INCOMPATIBLE_DIGITAL_THRESHOLDS]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
71
|
+
[PP_ERROR.REQUIRES_CONNECTED_SOURCE_OR_BIDIR]: SEVERITY.RPT_SEVERITY_WARNING,
|
|
72
|
+
[PP_ERROR.ILLEGAL_CONNECTION]: SEVERITY.RPT_SEVERITY_ERROR,
|
|
73
|
+
};
|
|
@@ -1,112 +1,39 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
if (typeof b !== "function" && b !== null)
|
|
10
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
-
extendStatics(d, b);
|
|
12
|
-
function __() { this.constructor = d; }
|
|
13
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
-
};
|
|
15
|
-
})();
|
|
16
|
-
var __values = (this && this.__values) || function(o) {
|
|
17
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
18
|
-
if (m) return m.call(o);
|
|
19
|
-
if (o && typeof o.length === "number") return {
|
|
20
|
-
next: function () {
|
|
21
|
-
if (o && i >= o.length) o = void 0;
|
|
22
|
-
return { value: o && o[i++], done: !o };
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
26
|
-
};
|
|
27
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
28
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
29
|
-
if (!m) return o;
|
|
30
|
-
var i = m.call(o), r, ar = [], e;
|
|
31
|
-
try {
|
|
32
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
33
|
-
}
|
|
34
|
-
catch (error) { e = { error: error }; }
|
|
35
|
-
finally {
|
|
36
|
-
try {
|
|
37
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
38
|
-
}
|
|
39
|
-
finally { if (e) throw e.error; }
|
|
40
|
-
}
|
|
41
|
-
return ar;
|
|
42
|
-
};
|
|
43
1
|
import { LABEL_ASSOCIATED } from '@modular-circuit/electronics-model';
|
|
44
|
-
|
|
45
|
-
|
|
2
|
+
export class LinkTesterBase {
|
|
3
|
+
ctx;
|
|
4
|
+
ports;
|
|
5
|
+
link;
|
|
6
|
+
_all_port_ids;
|
|
7
|
+
constructor(ctx, ports) {
|
|
46
8
|
this.ctx = ctx;
|
|
47
9
|
this.ports = ports;
|
|
48
10
|
}
|
|
49
|
-
|
|
11
|
+
test() {
|
|
50
12
|
if (!this.init_link())
|
|
51
13
|
return;
|
|
52
14
|
this.check_parameter_propagation();
|
|
53
|
-
};
|
|
54
|
-
Object.defineProperty(LinkTesterBase.prototype, "all_port_ids", {
|
|
55
|
-
get: function () {
|
|
56
|
-
var _this = this;
|
|
57
|
-
if (!this._all_port_ids)
|
|
58
|
-
this._all_port_ids = this.ports.map(function (v) { return _this.ctx.port_id.get(v); });
|
|
59
|
-
return this._all_port_ids;
|
|
60
|
-
},
|
|
61
|
-
enumerable: false,
|
|
62
|
-
configurable: true
|
|
63
|
-
});
|
|
64
|
-
return LinkTesterBase;
|
|
65
|
-
}());
|
|
66
|
-
export { LinkTesterBase };
|
|
67
|
-
var CompositePortLinkTesterBase = /** @class */ (function (_super) {
|
|
68
|
-
__extends(CompositePortLinkTesterBase, _super);
|
|
69
|
-
function CompositePortLinkTesterBase() {
|
|
70
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
71
15
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
84
|
-
}
|
|
85
|
-
finally { if (e_1) throw e_1.error; }
|
|
16
|
+
get all_port_ids() {
|
|
17
|
+
if (!this._all_port_ids)
|
|
18
|
+
this._all_port_ids = this.ports.map((v) => this.ctx.port_id.get(v));
|
|
19
|
+
return this._all_port_ids;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class CompositePortLinkTesterBase extends LinkTesterBase {
|
|
23
|
+
test() {
|
|
24
|
+
for (const port of this.ports) {
|
|
25
|
+
this.annot_composite_port(port, this.ctx.port_id.get(port));
|
|
86
26
|
}
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
var _d = __read(_c.value, 2), k = _d[0], v = _d[1];
|
|
94
|
-
if (k === LABEL_ASSOCIATED && typeof v === 'string') {
|
|
95
|
-
this.ctx.port_id.set(port, v);
|
|
96
|
-
}
|
|
97
|
-
else if (typeof v === 'object' && !Array.isArray(v) && v !== null) {
|
|
98
|
-
this.annot_composite_port(v, uuid);
|
|
99
|
-
}
|
|
27
|
+
super.test();
|
|
28
|
+
}
|
|
29
|
+
annot_composite_port(port, uuid) {
|
|
30
|
+
for (const [k, v] of Object.entries(port)) {
|
|
31
|
+
if (k === LABEL_ASSOCIATED && typeof v === 'string') {
|
|
32
|
+
this.ctx.port_id.set(port, v);
|
|
100
33
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
finally {
|
|
104
|
-
try {
|
|
105
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
34
|
+
else if (typeof v === 'object' && !Array.isArray(v) && v !== null) {
|
|
35
|
+
this.annot_composite_port(v, uuid);
|
|
106
36
|
}
|
|
107
|
-
finally { if (e_2) throw e_2.error; }
|
|
108
37
|
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
}(LinkTesterBase));
|
|
112
|
-
export { CompositePortLinkTesterBase };
|
|
38
|
+
}
|
|
39
|
+
}
|