@modular-circuit/transpiler 0.0.77 → 0.0.80
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/builder/graph_to_kicad/do_convert_graph_to_kicad_project.js +108 -19
- package/build/builder/graph_to_kicad/index.js +59 -4
- package/build/converter/graph_to_netlist/graph_converter.js +171 -51
- package/build/converter/kicad_sexpr/eeschema/drawing_sheet/sch_default_drawing_sheet.js +1 -1
- package/build/converter/kicad_sexpr/eeschema/printer.js +290 -245
- package/build/converter/link_to_netlist/converter.js +135 -77
- package/build/converter/link_to_netlist/links/converter_base.js +131 -38
- package/build/converter/link_to_netlist/links/converters.js +554 -316
- package/build/converter/netlist_to_kicad/calc_boxes_pos.d.ts +1 -1
- package/build/converter/netlist_to_kicad/calc_boxes_pos.d.ts.map +1 -1
- package/build/converter/netlist_to_kicad/calc_boxes_pos.js +106 -35
- package/build/converter/netlist_to_kicad/layout.js +32 -28
- package/build/converter/netlist_to_kicad/netlist_converter.d.ts +1 -1
- package/build/converter/netlist_to_kicad/netlist_converter.d.ts.map +1 -1
- package/build/converter/netlist_to_kicad/netlist_converter.js +300 -128
- package/build/kicad/constraints/index.js +1 -1
- package/build/kicad/label/net_label.js +2 -2
- package/build/kicad/label/sheet_pin.js +19 -11
- package/build/kicad/project/kicad_prl.js +3 -3
- package/build/kicad/project/kicad_pro.js +4 -4
- package/build/kicad/project/kicad_project_achieve.js +45 -31
- package/build/kicad/project/wildcards_and_files_ext.js +61 -61
- package/build/kicad/sheet/sheet.js +3 -3
- package/build/kicad/symbols/lib_symbol/gnd.js +6 -6
- package/build/kicad/symbols/lib_symbol/vcc.js +7 -7
- package/build/kicad/symbols/sch_symbol/gnd.js +9 -9
- package/build/kicad/symbols/sch_symbol/vcc.js +9 -9
- package/build/kicad/symbols/symbol_utils.js +1 -1
- package/build/kicad/wire/gen_wire.js +4 -4
- package/build/utils/collect_sub_sheets.js +151 -37
- package/build/utils/constraints.js +6 -6
- package/build/utils/filter_null_undefined.js +31 -2
- package/build/utils/string_formatter.js +29 -23
- package/package.json +5 -5
|
@@ -1,96 +1,154 @@
|
|
|
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
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
13
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
14
|
+
if (!m) return o;
|
|
15
|
+
var i = m.call(o), r, ar = [], e;
|
|
16
|
+
try {
|
|
17
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
18
|
+
}
|
|
19
|
+
catch (error) { e = { error: error }; }
|
|
20
|
+
finally {
|
|
21
|
+
try {
|
|
22
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
23
|
+
}
|
|
24
|
+
finally { if (e) throw e.error; }
|
|
25
|
+
}
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
1
28
|
import { ConnectionNodeType, LinkType, gen_link_map, get_port_link_type, } from '@modular-circuit/electronics-model';
|
|
2
29
|
import { CanDiffLinkTester, CanLogicLinkTester, CrystalLinkTester, Dvp8LinkTester, I2cLinkTester, I2sLinkTester, MetaPortConverter, SpeakerLinkTester, SpiLinkTester, SwdLinkTester, UartLinkTester, UsbCcLinkTester, UsbLinkTester, } from './links';
|
|
3
|
-
|
|
4
|
-
ctx
|
|
5
|
-
constructor(ctx) {
|
|
30
|
+
var LINK_CONVERTER = /** @class */ (function () {
|
|
31
|
+
function LINK_CONVERTER(ctx) {
|
|
6
32
|
this.ctx = ctx;
|
|
7
33
|
}
|
|
8
|
-
|
|
9
|
-
port_id;
|
|
10
|
-
port_is_composite_port(p) {
|
|
34
|
+
LINK_CONVERTER.prototype.port_is_composite_port = function (p) {
|
|
11
35
|
return Object.values(this.ctx.pin_map[this.port_id.get(p)]).length > 1;
|
|
12
|
-
}
|
|
13
|
-
do_convert(CtorClass, ports, net_pros) {
|
|
36
|
+
};
|
|
37
|
+
LINK_CONVERTER.prototype.do_convert = function (CtorClass, ports, net_pros) {
|
|
14
38
|
return new CtorClass(this.ctx, ports, net_pros).convert();
|
|
15
|
-
}
|
|
16
|
-
visit_cc(cc) {
|
|
39
|
+
};
|
|
40
|
+
LINK_CONVERTER.prototype.visit_cc = function (cc) {
|
|
41
|
+
var e_1, _a, e_2, _b, e_3, _c;
|
|
17
42
|
if (cc.is_isolated) {
|
|
18
43
|
return;
|
|
19
44
|
}
|
|
20
45
|
this.link_map = gen_link_map();
|
|
21
|
-
|
|
22
|
-
|
|
46
|
+
var ports = cc.nodes.filter(function (i) { return i.type === ConnectionNodeType.Port; });
|
|
47
|
+
var meta_ports = [];
|
|
23
48
|
this.port_id = new Map();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const arr = this.link_map[get_port_link_type(port)];
|
|
29
|
-
if (this.port_is_composite_port(port)) {
|
|
30
|
-
arr.push(port);
|
|
49
|
+
try {
|
|
50
|
+
for (var ports_1 = __values(ports), ports_1_1 = ports_1.next(); !ports_1_1.done; ports_1_1 = ports_1.next()) {
|
|
51
|
+
var p = ports_1_1.value;
|
|
52
|
+
this.port_id.set(p.param, p.uuid);
|
|
31
53
|
}
|
|
32
|
-
|
|
33
|
-
|
|
54
|
+
}
|
|
55
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
56
|
+
finally {
|
|
57
|
+
try {
|
|
58
|
+
if (ports_1_1 && !ports_1_1.done && (_a = ports_1.return)) _a.call(ports_1);
|
|
34
59
|
}
|
|
60
|
+
finally { if (e_1) throw e_1.error; }
|
|
35
61
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
this.do_convert(CanLogicLinkTester, v, cc);
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
case LinkType.CanDiffLink: {
|
|
47
|
-
this.do_convert(CanDiffLinkTester, v, cc);
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
case LinkType.CrystalLink: {
|
|
51
|
-
this.do_convert(CrystalLinkTester, v, cc);
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
case LinkType.SwdLink: {
|
|
55
|
-
this.do_convert(SwdLinkTester, v, cc);
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
case LinkType.I2cLink: {
|
|
59
|
-
this.do_convert(I2cLinkTester, v, cc);
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
case LinkType.I2sLink: {
|
|
63
|
-
this.do_convert(I2sLinkTester, v, cc);
|
|
64
|
-
break;
|
|
62
|
+
try {
|
|
63
|
+
for (var ports_2 = __values(ports), ports_2_1 = ports_2.next(); !ports_2_1.done; ports_2_1 = ports_2.next()) {
|
|
64
|
+
var v = ports_2_1.value;
|
|
65
|
+
var port = v.param;
|
|
66
|
+
var arr = this.link_map[get_port_link_type(port)];
|
|
67
|
+
if (this.port_is_composite_port(port)) {
|
|
68
|
+
arr.push(port);
|
|
65
69
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
break;
|
|
70
|
+
else {
|
|
71
|
+
meta_ports.push(port);
|
|
69
72
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
76
|
+
finally {
|
|
77
|
+
try {
|
|
78
|
+
if (ports_2_1 && !ports_2_1.done && (_b = ports_2.return)) _b.call(ports_2);
|
|
79
|
+
}
|
|
80
|
+
finally { if (e_2) throw e_2.error; }
|
|
81
|
+
}
|
|
82
|
+
var meta_port_converter = new MetaPortConverter(this.ctx, meta_ports, cc);
|
|
83
|
+
meta_port_converter.convert();
|
|
84
|
+
try {
|
|
85
|
+
for (var _d = __values(Object.entries(this.link_map)), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
86
|
+
var _f = __read(_e.value, 2), k = _f[0], v = _f[1];
|
|
87
|
+
if (!v || !v.length)
|
|
88
|
+
continue;
|
|
89
|
+
switch (k) {
|
|
90
|
+
case LinkType.CanLogicLink: {
|
|
91
|
+
this.do_convert(CanLogicLinkTester, v, cc);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case LinkType.CanDiffLink: {
|
|
95
|
+
this.do_convert(CanDiffLinkTester, v, cc);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case LinkType.CrystalLink: {
|
|
99
|
+
this.do_convert(CrystalLinkTester, v, cc);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case LinkType.SwdLink: {
|
|
103
|
+
this.do_convert(SwdLinkTester, v, cc);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
case LinkType.I2cLink: {
|
|
107
|
+
this.do_convert(I2cLinkTester, v, cc);
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case LinkType.I2sLink: {
|
|
111
|
+
this.do_convert(I2sLinkTester, v, cc);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case LinkType.SpiLink: {
|
|
115
|
+
this.do_convert(SpiLinkTester, v, cc);
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
case LinkType.SpeakerLink: {
|
|
119
|
+
this.do_convert(SpeakerLinkTester, v, cc);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
case LinkType.UartLink: {
|
|
123
|
+
this.do_convert(UartLinkTester, v, cc);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
case LinkType.UsbLink: {
|
|
127
|
+
this.do_convert(UsbLinkTester, v, cc);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case LinkType.UsbCcLink: {
|
|
131
|
+
this.do_convert(UsbCcLinkTester, v, cc);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
case LinkType.Dvp8Link: {
|
|
135
|
+
this.do_convert(Dvp8LinkTester, v, cc);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
default: {
|
|
139
|
+
throw new Error("Unhandled link type: ".concat(k));
|
|
140
|
+
}
|
|
92
141
|
}
|
|
93
142
|
}
|
|
94
143
|
}
|
|
95
|
-
|
|
96
|
-
|
|
144
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
145
|
+
finally {
|
|
146
|
+
try {
|
|
147
|
+
if (_e && !_e.done && (_c = _d.return)) _c.call(_d);
|
|
148
|
+
}
|
|
149
|
+
finally { if (e_3) throw e_3.error; }
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
return LINK_CONVERTER;
|
|
153
|
+
}());
|
|
154
|
+
export { LINK_CONVERTER };
|
|
@@ -1,63 +1,156 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
44
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
45
|
+
if (ar || !(i in from)) {
|
|
46
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
47
|
+
ar[i] = from[i];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
51
|
+
};
|
|
52
|
+
var LinkConverterBase = /** @class */ (function () {
|
|
53
|
+
function LinkConverterBase(ctx, ports, net_pros) {
|
|
7
54
|
this.ctx = ctx;
|
|
8
55
|
this.ports = ports;
|
|
9
56
|
this.net_pros = net_pros;
|
|
10
57
|
}
|
|
11
|
-
convert() {
|
|
58
|
+
LinkConverterBase.prototype.convert = function () {
|
|
12
59
|
if (!this.init_link())
|
|
13
60
|
return;
|
|
14
61
|
this.do_convert();
|
|
15
|
-
}
|
|
16
|
-
get_net_code() {
|
|
62
|
+
};
|
|
63
|
+
LinkConverterBase.prototype.get_net_code = function () {
|
|
17
64
|
return this.ctx.nl_netlist.nets.length + 1;
|
|
18
|
-
}
|
|
19
|
-
gen_net_name(signal_name) {
|
|
20
|
-
|
|
65
|
+
};
|
|
66
|
+
LinkConverterBase.prototype.gen_net_name = function (signal_name) {
|
|
67
|
+
var base_net_name = signal_name ? "".concat(this.net_pros.name, "-").concat(signal_name) : "".concat(this.net_pros.name);
|
|
21
68
|
if (this.net_pros.is_global_pwr)
|
|
22
69
|
return base_net_name;
|
|
23
70
|
if (!this.ctx.net_names_count.has(base_net_name)) {
|
|
24
71
|
this.ctx.net_names_count.set(base_net_name, 0);
|
|
25
72
|
return base_net_name;
|
|
26
73
|
}
|
|
27
|
-
|
|
74
|
+
var count = this.ctx.net_names_count.get(base_net_name);
|
|
28
75
|
this.ctx.net_names_count.set(base_net_name, count + 1);
|
|
29
|
-
return
|
|
76
|
+
return "".concat(base_net_name, "-").concat(count);
|
|
77
|
+
};
|
|
78
|
+
return LinkConverterBase;
|
|
79
|
+
}());
|
|
80
|
+
export { LinkConverterBase };
|
|
81
|
+
var MetaPortConverter = /** @class */ (function (_super) {
|
|
82
|
+
__extends(MetaPortConverter, _super);
|
|
83
|
+
function MetaPortConverter() {
|
|
84
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
30
85
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
86
|
+
MetaPortConverter.prototype.do_convert = function () {
|
|
87
|
+
var e_1, _a;
|
|
88
|
+
var pins = [];
|
|
89
|
+
try {
|
|
90
|
+
for (var _b = __values(this.ports), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
91
|
+
var p = _c.value;
|
|
92
|
+
var p_id = this.ctx.port_map.get(p);
|
|
93
|
+
pins.push.apply(pins, __spreadArray([], __read(Object.values(this.ctx.pin_map[p_id])), false));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
97
|
+
finally {
|
|
98
|
+
try {
|
|
99
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
100
|
+
}
|
|
101
|
+
finally { if (e_1) throw e_1.error; }
|
|
38
102
|
}
|
|
39
103
|
this.ctx.nl_netlist.nets.push({
|
|
40
104
|
code: this.get_net_code(),
|
|
41
105
|
name: this.gen_net_name(),
|
|
42
|
-
pins,
|
|
106
|
+
pins: pins,
|
|
43
107
|
});
|
|
44
|
-
}
|
|
45
|
-
init_link() {
|
|
108
|
+
};
|
|
109
|
+
MetaPortConverter.prototype.init_link = function () {
|
|
46
110
|
return true;
|
|
111
|
+
};
|
|
112
|
+
return MetaPortConverter;
|
|
113
|
+
}(LinkConverterBase));
|
|
114
|
+
export { MetaPortConverter };
|
|
115
|
+
var CompositePortLinkConverterBase = /** @class */ (function (_super) {
|
|
116
|
+
__extends(CompositePortLinkConverterBase, _super);
|
|
117
|
+
function CompositePortLinkConverterBase() {
|
|
118
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
47
119
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
120
|
+
CompositePortLinkConverterBase.prototype.do_convert = function () {
|
|
121
|
+
var e_2, _a, e_3, _b;
|
|
122
|
+
try {
|
|
123
|
+
for (var _c = __values(this.get_signals()), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
124
|
+
var signal = _d.value;
|
|
125
|
+
var pins = [];
|
|
126
|
+
try {
|
|
127
|
+
for (var _e = (e_3 = void 0, __values(signal.ports)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
128
|
+
var port = _f.value;
|
|
129
|
+
pins.push(this.ctx.pin_map[this.ctx.port_map.get(port.parent)][port.meta_port.label_associated]);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
133
|
+
finally {
|
|
134
|
+
try {
|
|
135
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
136
|
+
}
|
|
137
|
+
finally { if (e_3) throw e_3.error; }
|
|
138
|
+
}
|
|
139
|
+
this.ctx.nl_netlist.nets.push({
|
|
140
|
+
code: this.get_net_code(),
|
|
141
|
+
name: this.gen_net_name(signal.name),
|
|
142
|
+
pins: pins,
|
|
143
|
+
});
|
|
55
144
|
}
|
|
56
|
-
this.ctx.nl_netlist.nets.push({
|
|
57
|
-
code: this.get_net_code(),
|
|
58
|
-
name: this.gen_net_name(signal.name),
|
|
59
|
-
pins,
|
|
60
|
-
});
|
|
61
145
|
}
|
|
62
|
-
|
|
63
|
-
|
|
146
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
147
|
+
finally {
|
|
148
|
+
try {
|
|
149
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
150
|
+
}
|
|
151
|
+
finally { if (e_2) throw e_2.error; }
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
return CompositePortLinkConverterBase;
|
|
155
|
+
}(LinkConverterBase));
|
|
156
|
+
export { CompositePortLinkConverterBase };
|