Skip to content

Commit 11aefd6

Browse files
chelprocRn86222
andcommitted
support multiple NodePins for a single ComponentPin
Co-authored-by: Rn86222 <[email protected]>
1 parent 5cc71e4 commit 11aefd6

File tree

11 files changed

+507
-340
lines changed

11 files changed

+507
-340
lines changed

src/pages/edit/Editor/components/ContextMenu.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ export default function CCComponentEditorContextMenu({
7777
parentComponentId: newComponent.id,
7878
position: oldNode.position,
7979
componentId: oldNode.componentId,
80-
variablePins: [],
8180
});
8281
oldToNewNodeIdMap.set(oldNode.id, newNode.id);
8382
return newNode;
@@ -154,7 +153,7 @@ export default function CCComponentEditorContextMenu({
154153
invariant(targetNode);
155154
const targetComponent = store.components.get(targetNode.componentId);
156155
invariant(targetComponent);
157-
if (targetComponent.isIntrinsic) return undefined;
156+
if (targetComponent.intrinsicType) return undefined;
158157
return (
159158
<>
160159
<Divider />

src/pages/edit/Editor/renderer/Node.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ const CCComponentEditorRendererNode = ensureStoreItem(
5656
x: previousNodePosition.x + diff.x,
5757
y: previousNodePosition.y + diff.y,
5858
},
59-
variablePins: node.variablePins,
6059
});
6160
}
6261
};

src/pages/edit/Editor/renderer/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ export default function CCComponentEditorRenderer() {
4747
y: e.nativeEvent.offsetY,
4848
}
4949
),
50-
variablePins: [], // todo
5150
})
5251
);
5352
}}

src/pages/home/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export type HomePageProps = {
1818
export default function HomePage({ onComponentSelected }: HomePageProps) {
1919
const { store, resetStore } = useStore();
2020
const components = useComponents().filter(
21-
(component) => !component.isIntrinsic
21+
(component) => !component.intrinsicType
2222
);
2323
const downloadStore = () => {
2424
const storeJSON = store.toJSON();

src/store/component.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import type { Opaque } from "type-fest";
22
import EventEmitter from "eventemitter3";
33
import invariant from "tiny-invariant";
44
import type CCStore from ".";
5+
import type { CCIntrinsicComponentType } from "./intrinsics";
56

67
export type CCComponentId = Opaque<string, "CCComponentId">;
78

89
export type CCComponent = {
910
readonly id: CCComponentId;
10-
readonly isIntrinsic: boolean;
11+
/** null for user-defined components */
12+
readonly intrinsicType: CCIntrinsicComponentType | null;
1113
name: string;
1214
};
1315

@@ -98,11 +100,11 @@ export class CCComponentStore extends EventEmitter<CCComponentStoreEvents> {
98100
* @returns a new component
99101
*/
100102
static create(
101-
partialComponent: Omit<CCComponent, "id" | "isIntrinsic">
103+
partialComponent: Omit<CCComponent, "id" | "intrinsicType">
102104
): CCComponent {
103105
return {
104106
id: crypto.randomUUID() as CCComponentId,
105-
isIntrinsic: false,
107+
intrinsicType: null,
106108
...partialComponent,
107109
};
108110
}
@@ -129,7 +131,7 @@ export function isIncluding(
129131
targetComponentId: CCComponentId
130132
) {
131133
const component = store.components.get(componentId)!;
132-
if (component.isIntrinsic) return false;
134+
if (component.intrinsicType) return false;
133135

134136
const checkedComponentIds = new Set<CCComponentId>();
135137
const dfs = (_componentId: CCComponentId): boolean => {
@@ -149,7 +151,7 @@ export function isIncluding(
149151

150152
function validateComponent(store: CCStore, componentId: CCComponentId) {
151153
const component = store.components.get(componentId)!;
152-
if (component.isIntrinsic) return;
154+
if (component.intrinsicType) return;
153155

154156
const nodes = store.nodes.getManyByParentComponentId(componentId);
155157
const connections = store.connections.getManyByParentComponentId(componentId);

src/store/componentEvaluator.ts

Lines changed: 57 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,18 @@ function simulateIntrinsic(
2929
return componentPin.type === "output";
3030
});
3131
switch (componentId) {
32-
case intrinsics.notIntrinsicComponent.id: {
32+
case intrinsics.notIntrinsicComponentDefinition.component.id: {
3333
invariant(pinIds.length === 2);
3434
const inputPinId = inputNodePins.find(
3535
(nodePin: CCNodePin) =>
36-
nodePin.componentPinId === intrinsics.notIntrinsicComponentInputPin.id
36+
nodePin.componentPinId ===
37+
intrinsics.notIntrinsicComponentDefinition.inputPins[0]!.id
3738
)!.id;
3839
const inputValue = inputValues.get(inputPinId);
3940
const outputPinId = outputNodePins.find(
4041
(nodePin: CCNodePin) =>
4142
nodePin.componentPinId ===
42-
intrinsics.notIntrinsicComponentOutputPin.id
43+
intrinsics.notIntrinsicComponentDefinition.outputPins[0]!.id
4344
)!.id;
4445
const outputValue = [];
4546
for (const value of inputValue!) {
@@ -49,24 +50,24 @@ function simulateIntrinsic(
4950
outputValues.set(outputPinId, outputValue);
5051
return outputValues;
5152
}
52-
case intrinsics.andIntrinsicComponent.id: {
53+
case intrinsics.andIntrinsicComponentDefinition.component.id: {
5354
invariant(pinIds.length === 3);
5455
const inputPinId0 = inputNodePins.find(
5556
(nodePin: CCNodePin) =>
5657
nodePin.componentPinId ===
57-
intrinsics.andIntrinsicComponentInputPinA.id
58+
intrinsics.andIntrinsicComponentDefinition.inputPins[0]!.id
5859
)!.id;
5960
const inputPinId1 = inputNodePins.find(
6061
(nodePin: CCNodePin) =>
6162
nodePin.componentPinId ===
62-
intrinsics.andIntrinsicComponentInputPinB.id
63+
intrinsics.andIntrinsicComponentDefinition.inputPins[1]!.id
6364
)!.id;
6465
const inputValue0 = inputValues.get(inputPinId0);
6566
const inputValue1 = inputValues.get(inputPinId1);
6667
const outputPinId = outputNodePins.find(
6768
(nodePin: CCNodePin) =>
6869
nodePin.componentPinId ===
69-
intrinsics.andIntrinsicComponentOutputPin.id
70+
intrinsics.andIntrinsicComponentDefinition.outputPins[0]!.id
7071
)!.id;
7172
const outputValue = [];
7273
if (inputValue0!.length !== inputValue1!.length) {
@@ -79,21 +80,24 @@ function simulateIntrinsic(
7980
outputValues.set(outputPinId, outputValue);
8081
return outputValues;
8182
}
82-
case intrinsics.orIntrinsicComponent.id: {
83+
case intrinsics.orIntrinsicComponentDefinition.component.id: {
8384
invariant(pinIds.length === 3);
8485
const inputPinId0 = inputNodePins.find(
8586
(nodePin: CCNodePin) =>
86-
nodePin.componentPinId === intrinsics.orIntrinsicComponentInputPinA.id
87+
nodePin.componentPinId ===
88+
intrinsics.orIntrinsicComponentDefinition.inputPins[0]!.id
8789
)!.id;
8890
const inputPinId1 = inputNodePins.find(
8991
(nodePin: CCNodePin) =>
90-
nodePin.componentPinId === intrinsics.orIntrinsicComponentInputPinB.id
92+
nodePin.componentPinId ===
93+
intrinsics.orIntrinsicComponentDefinition.inputPins[1]!.id
9194
)!.id;
9295
const inputValue0 = inputValues.get(inputPinId0);
9396
const inputValue1 = inputValues.get(inputPinId1);
9497
const outputPinId = outputNodePins.find(
9598
(nodePin: CCNodePin) =>
96-
nodePin.componentPinId === intrinsics.orIntrinsicComponentOutputPin.id
99+
nodePin.componentPinId ===
100+
intrinsics.orIntrinsicComponentDefinition.outputPins[0]!.id
97101
)!.id;
98102
const outputValue = [];
99103
if (inputValue0!.length !== inputValue1!.length) {
@@ -106,24 +110,24 @@ function simulateIntrinsic(
106110
outputValues.set(outputPinId, outputValue);
107111
return outputValues;
108112
}
109-
case intrinsics.xorIntrinsicComponent.id: {
113+
case intrinsics.xorIntrinsicComponentDefinition.component.id: {
110114
invariant(pinIds.length === 3);
111115
const inputPinId0 = inputNodePins.find(
112116
(nodePin: CCNodePin) =>
113117
nodePin.componentPinId ===
114-
intrinsics.xorIntrinsicComponentInputPinA.id
118+
intrinsics.xorIntrinsicComponentDefinition.inputPins[0]!.id
115119
)!.id;
116120
const inputPinId1 = inputNodePins.find(
117121
(nodePin: CCNodePin) =>
118122
nodePin.componentPinId ===
119-
intrinsics.xorIntrinsicComponentInputPinB.id
123+
intrinsics.xorIntrinsicComponentDefinition.inputPins[1]!.id
120124
)!.id;
121125
const inputValue0 = inputValues.get(inputPinId0);
122126
const inputValue1 = inputValues.get(inputPinId1);
123127
const outputPinId = outputNodePins.find(
124128
(nodePin: CCNodePin) =>
125129
nodePin.componentPinId ===
126-
intrinsics.xorIntrinsicComponentOutputPin.id
130+
intrinsics.xorIntrinsicComponentDefinition.outputPins[0]!.id
127131
)!.id;
128132
const outputValue = [];
129133
if (inputValue0!.length !== inputValue1!.length) {
@@ -136,18 +140,18 @@ function simulateIntrinsic(
136140
outputValues.set(outputPinId, outputValue);
137141
return outputValues;
138142
}
139-
case intrinsics.inputIntrinsicComponent.id: {
143+
case intrinsics.inputIntrinsicComponentDefinition.component.id: {
140144
invariant(pinIds.length === 2);
141145
const inputPinId = inputNodePins.find(
142146
(nodePin: CCNodePin) =>
143147
nodePin.componentPinId ===
144-
intrinsics.inputIntrinsicComponentInputPin.id
148+
intrinsics.inputIntrinsicComponentDefinition.inputPins[0]!.id
145149
)!.id;
146150
const inputValue = inputValues.get(inputPinId);
147151
const outputPinId = outputNodePins.find(
148152
(nodePin: CCNodePin) =>
149153
nodePin.componentPinId ===
150-
intrinsics.inputIntrinsicComponentOutputPin.id
154+
intrinsics.inputIntrinsicComponentDefinition.outputPins[0]!.id
151155
)!.id;
152156
const outputValue = [];
153157
for (const value of inputValue!) {
@@ -157,46 +161,46 @@ function simulateIntrinsic(
157161
outputValues.set(outputPinId, outputValue);
158162
return outputValues;
159163
}
160-
case intrinsics.fourBitsIntrinsicComponent.id: {
161-
invariant(node.variablePins);
162-
const outputValue = node.variablePins.flatMap(
163-
(variablePin) => inputValues.get(variablePin)!
164-
);
165-
const outputMap = new Map<CCNodePinId, SimulationValue>();
166-
const outputPinId = outputNodePins.find(
164+
case intrinsics.aggregateIntrinsicComponentDefinition.component.id: {
165+
const outputPin = outputNodePins.find(
167166
(nodePin: CCNodePin) =>
168167
nodePin.componentPinId ===
169-
intrinsics.fourBitsIntrinsicComponentOutputPin.id
170-
)!.id;
171-
outputMap.set(outputPinId, outputValue);
168+
intrinsics.aggregateIntrinsicComponentDefinition.outputPins[0]!.id
169+
)!;
170+
const outputValue = new Array<boolean>(
171+
outputPin.userSpecifiedBitWidth!
172+
).fill(false);
173+
for (const pin of inputNodePins) {
174+
outputValue[pin.order] = inputValues.get(pin.id)![pin.order]!;
175+
}
176+
const outputMap = new Map<CCNodePinId, SimulationValue>();
177+
outputMap.set(outputPin.id, outputValue);
172178
return outputMap;
173179
}
174-
case intrinsics.distributeFourBitsIntrinsicComponent.id: {
180+
case intrinsics.decomposeIntrinsicComponentDefinition.component.id: {
175181
const inputPinId = inputNodePins.find(
176182
(nodePin: CCNodePin) =>
177183
nodePin.componentPinId ===
178-
intrinsics.distributeFourBitsIntrinsicComponentInputPin.id
184+
intrinsics.decomposeIntrinsicComponentDefinition.inputPins[0]!.id
179185
)!.id;
180186
const inputs = inputValues.get(inputPinId)!;
181187
const outputMap = new Map<CCNodePinId, SimulationValue>();
182-
invariant(node.variablePins);
183-
invariant(node.variablePins.length === inputs.length);
184-
for (let i = 0; i < node.variablePins.length; i += 1) {
185-
outputMap.set(node.variablePins[i]!, [inputs[i]!]);
188+
for (const pin of outputNodePins) {
189+
outputMap.set(pin.id, [inputs[pin.order]!]);
186190
}
187191
return outputMap;
188192
}
189-
case intrinsics.flipFlopIntrinsicComponent.id: {
193+
case intrinsics.flipFlopIntrinsicComponentDefinition.component.id: {
190194
invariant(pinIds.length === 2);
191195
const inputPinId = inputNodePins.find(
192196
(nodePin: CCNodePin) =>
193197
nodePin.componentPinId ===
194-
intrinsics.flipFlopIntrinsicComponentInputPin.id
198+
intrinsics.flipFlopIntrinsicComponentDefinition.inputPins[0]!.id
195199
)!.id;
196200
const outputPinId = outputNodePins.find(
197201
(nodePin: CCNodePin) =>
198202
nodePin.componentPinId ===
199-
intrinsics.flipFlopIntrinsicComponentOutputPin.id
203+
intrinsics.flipFlopIntrinsicComponentDefinition.outputPins[0]!.id
200204
)!.id;
201205
const outputValues = new Map<CCNodePinId, SimulationValue>();
202206

@@ -238,7 +242,7 @@ function simulateNode(
238242
const node = store.nodes.get(nodeId)!;
239243
const component = store.components.get(node.componentId);
240244
if (!component) throw new Error(`Component ${component} is not defined.`);
241-
if (component.isIntrinsic) {
245+
if (component.intrinsicType) {
242246
const outputValues = simulateIntrinsic(
243247
store,
244248
nodeId,
@@ -349,13 +353,17 @@ function simulateNode(
349353
})!;
350354
outputValues.set(parentNodePin.id, outputValue);
351355
}
352-
if (currentComponentId === intrinsics.flipFlopIntrinsicComponent.id) {
356+
if (
357+
currentComponentId ===
358+
intrinsics.flipFlopIntrinsicComponentDefinition.component.id
359+
) {
353360
visitedFlipFlops.add(currentNodeId);
354361
}
355362
}
356363
}
357364
} else if (
358-
currentComponentId === intrinsics.flipFlopIntrinsicComponent.id &&
365+
currentComponentId ===
366+
intrinsics.flipFlopIntrinsicComponentDefinition.component.id &&
359367
!visitedFlipFlops.has(currentNodeId)
360368
) {
361369
const frame = previousFrame
@@ -396,7 +404,10 @@ function simulateNode(
396404
})!;
397405
outputValues.set(parentNodePin.id, outputValue);
398406
}
399-
if (currentComponentId === intrinsics.flipFlopIntrinsicComponent.id) {
407+
if (
408+
currentComponentId ===
409+
intrinsics.flipFlopIntrinsicComponentDefinition.component.id
410+
) {
400411
visitedFlipFlops.add(currentNodeId);
401412
}
402413
}
@@ -487,7 +498,7 @@ export default function simulateComponent(
487498
) {
488499
const frame = (() => {
489500
if (!previousFrame) return null;
490-
if (currentComponent.isIntrinsic) {
501+
if (currentComponent.intrinsicType) {
491502
return previousFrame;
492503
}
493504
return previousFrame.nodes.get(currentNodeId)!.child;
@@ -532,7 +543,10 @@ export default function simulateComponent(
532543
})!;
533544
outputValues.set(parentComponentPin.id, outputValue);
534545
}
535-
if (currentComponentId === intrinsics.flipFlopIntrinsicComponent.id) {
546+
if (
547+
currentComponentId ===
548+
intrinsics.flipFlopIntrinsicComponentDefinition.component.id
549+
) {
536550
visitedFlipFlops.add(currentNodeId);
537551
}
538552
}

0 commit comments

Comments
 (0)