Skip to content

Commit 9499de2

Browse files
authored
Merge pull request #286 from pathsim/feat/discrete-polynomial-icons
Icons and library entries for new pathsim discrete and Polynomial blocks
2 parents 25f12ab + 32a1928 commit 9499de2

8 files changed

Lines changed: 244 additions & 23 deletions

File tree

scripts/config/pathsim/blocks.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"Divider",
5050
"Amplifier",
5151
"Function",
52+
"Polynomial",
5253
"Sin",
5354
"Cos",
5455
"Tan",
@@ -78,9 +79,15 @@
7879
"LogicNot"
7980
],
8081

81-
"Mixed": [
82+
"Discrete": [
8283
"SampleHold",
84+
"FirstOrderHold",
8385
"FIR",
86+
"DiscreteIntegrator",
87+
"DiscreteDerivative",
88+
"DiscreteStateSpace",
89+
"DiscreteTransferFunction",
90+
"TappedDelay",
8491
"ADC",
8592
"DAC",
8693
"Counter",

src/lib/components/icons/blocks/curves.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,17 @@ export function sampleHoldSamples(n = 6): Sample[] {
647647
return out;
648648
}
649649

650+
/** First-order hold — piecewise-linear interpolation through sample points.
651+
* Same sample values as SampleHold so the two icons read as a pair. */
652+
export function firstOrderHoldSamples(n = 6): Sample[] {
653+
const samplesY = [0.1, 0.3, 0.55, 0.75, 0.55, 0.85];
654+
const out: Sample[] = [];
655+
for (let i = 0; i < n; i++) {
656+
out.push([i / (n - 1), samplesY[i]]);
657+
}
658+
return out;
659+
}
660+
650661
export function backlashSamples(): Sample[] {
651662
return [
652663
[-1, -0.7],

src/lib/components/icons/blocks/registry.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ export const iconRegistry: Record<string, IconDef> = {
108108
DynamicalSystem: { kind: 'math', latex: '\\begin{aligned}\\dot{x} &= f(x, u, t)\\\\ y &= g(x, u, t)\\end{aligned}' },
109109
DynamicalFunction: { kind: 'math', latex: 'f(u, t)' },
110110
Function: { kind: 'math', latex: 'f(u)' },
111+
Polynomial: { kind: 'math', latex: 'y = \\sum_{k=0}^{n} c_k\\,u^{n-k}' },
112+
113+
/* --- Discrete-time blocks --- */
114+
FirstOrderHold: { kind: 'plot', samples: () => C.firstOrderHoldSamples() },
115+
DiscreteIntegrator: { kind: 'math', latex: '\\dfrac{T}{z-1}' },
116+
DiscreteDerivative: { kind: 'math', latex: '\\dfrac{z-1}{T\\,z}' },
117+
DiscreteStateSpace: { kind: 'math', latex: '\\begin{aligned}x[k{+}1] &= Ax[k]{+}Bu[k]\\\\ y[k] &= Cx[k]{+}Du[k]\\end{aligned}' },
118+
DiscreteTransferFunction: { kind: 'math', latex: 'H(z) = \\dfrac{B(z)}{A(z)}' },
119+
TappedDelay: { kind: 'svg', name: 'TappedDelay' },
111120

112121
/* --- Geometric SVGs (kept as files) --- */
113122
Adder: { kind: 'svg', name: 'Adder' },
Lines changed: 8 additions & 0 deletions
Loading

src/lib/constants/python.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const BLOCK_CATEGORY_ORDER: string[] = [
2929
'Dynamic',
3030
'Algebraic',
3131
'Logic',
32-
'Mixed',
32+
'Discrete',
3333
'Recording',
3434
'Subsystem'
3535
];

src/lib/nodes/generated/blocks.ts

Lines changed: 200 additions & 18 deletions
Large diffs are not rendered by default.

src/lib/nodes/shapes/registry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ const categoryShapeMap: Record<string, string> = {
8888
Dynamic: 'rect',
8989
Algebraic: 'rect',
9090
Logic: 'rect',
91-
Mixed: 'mixed',
91+
Discrete: 'mixed',
9292
Recording: 'pill',
9393
Subsystem: 'rect',
9494
Chemical: 'rect'

src/lib/nodes/uiConfig.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,16 @@ export const syncPortBlocks = new Set([
7878
'Mod',
7979
'Clip',
8080
'Pow',
81+
'Polynomial',
8182
'Rescale',
8283
'Alias',
8384

8485
// Logic blocks (element-wise)
8586
'LogicNot',
8687

87-
// Mixed blocks (parallel sampling)
88-
'SampleHold'
88+
// Discrete blocks (parallel sampling / discrete dynamics)
89+
'SampleHold',
90+
'FirstOrderHold',
91+
'DiscreteIntegrator',
92+
'DiscreteDerivative'
8993
]);

0 commit comments

Comments
 (0)