[{"data":1,"prerenderedAt":821},["ShallowReactive",2],{"doc-block-system":3,"documentation-nav-slug":809},{"id":4,"title":5,"body":6,"category":800,"description":801,"extension":802,"meta":803,"navigation":361,"order":365,"path":804,"seo":805,"status":806,"stem":807,"__hash__":808},"documentation\u002Fdocumentation\u002Fblock-system.md","Block System",{"type":7,"value":8,"toc":776},"minimark",[9,13,17,22,25,36,41,97,101,105,166,170,228,232,289,293,301,317,320,324,331,335,438,442,601,605,608,629,633,637,682,686,690,693,722,726,729,758,762,772],[10,11,5],"h1",{"id":12},"block-system",[14,15,16],"p",{},"The SimFusion block system is the foundation of visual modeling. Learn about built-in blocks, creating custom blocks, and finding components with the Component Finder.",[18,19,21],"h2",{"id":20},"block-anatomy","Block Anatomy",[14,23,24],{},"Every block has:",[26,27,32],"pre",{"className":28,"code":30,"language":31},[29],"language-text","┌─────────────────────┐\n│     Block Name      │  ← Title\n│   [Configuration]   │  ← Parameters\n├─────────────────────┤\n│ ○ Input 1           │  ← Input ports\n│ ○ Input 2           │\n├─────────────────────┤\n│ ● Output 1          │  ← Output ports\n│ ● Output 2          │\n└─────────────────────┘\n","text",[33,34,30],"code",{"__ignoreMap":35},"",[37,38,40],"h3",{"id":39},"port-types","Port Types",[42,43,44,60],"table",{},[45,46,47],"thead",{},[48,49,50,54,57],"tr",{},[51,52,53],"th",{},"Type",[51,55,56],{},"Color",[51,58,59],{},"Data Direction",[61,62,63,75,86],"tbody",{},[48,64,65,69,72],{},[66,67,68],"td",{},"Data",[66,70,71],{},"Teal",[66,73,74],{},"Numeric arrays",[48,76,77,80,83],{},[66,78,79],{},"Control",[66,81,82],{},"Orange",[66,84,85],{},"Triggers, events",[48,87,88,91,94],{},[66,89,90],{},"Config",[66,92,93],{},"Green",[66,95,96],{},"Static parameters",[18,98,100],{"id":99},"built-in-libraries","Built-in Libraries",[37,102,104],{"id":103},"signal-sources","Signal Sources",[42,106,107,120],{},[45,108,109],{},[48,110,111,114,117],{},[51,112,113],{},"Block",[51,115,116],{},"Function",[51,118,119],{},"Parameters",[61,121,122,133,144,155],{},[48,123,124,127,130],{},[66,125,126],{},"Sine Wave",[66,128,129],{},"Generate sinusoidal signal",[66,131,132],{},"frequency, amplitude, phase",[48,134,135,138,141],{},[66,136,137],{},"Noise",[66,139,140],{},"Random noise generator",[66,142,143],{},"distribution, seed",[48,145,146,149,152],{},[66,147,148],{},"Step",[66,150,151],{},"Step function",[66,153,154],{},"delay, final value",[48,156,157,160,163],{},[66,158,159],{},"File Reader",[66,161,162],{},"Load from disk",[66,164,165],{},"filepath, format",[37,167,169],{"id":168},"signal-processing","Signal Processing",[42,171,172,182],{},[45,173,174],{},[48,175,176,178,180],{},[51,177,113],{},[51,179,116],{},[51,181,119],{},[61,183,184,195,206,217],{},[48,185,186,189,192],{},[66,187,188],{},"FFT",[66,190,191],{},"Fast Fourier Transform",[66,193,194],{},"size, window",[48,196,197,200,203],{},[66,198,199],{},"Filter",[66,201,202],{},"Digital filter",[66,204,205],{},"type, cutoff, order",[48,207,208,211,214],{},[66,209,210],{},"Math",[66,212,213],{},"Arithmetic operations",[66,215,216],{},"operation, constant",[48,218,219,222,225],{},[66,220,221],{},"Delay",[66,223,224],{},"Time delay",[66,226,227],{},"samples",[37,229,231],{"id":230},"sinks","Sinks",[42,233,234,244],{},[45,235,236],{},[48,237,238,240,242],{},[51,239,113],{},[51,241,116],{},[51,243,119],{},[61,245,246,257,268,278],{},[48,247,248,251,254],{},[66,249,250],{},"Scope",[66,252,253],{},"Real-time plot",[66,255,256],{},"channels, time window",[48,258,259,262,265],{},[66,260,261],{},"Spectrum",[66,263,264],{},"Frequency domain plot",[66,266,267],{},"bins, averaging",[48,269,270,273,276],{},[66,271,272],{},"File Writer",[66,274,275],{},"Save to disk",[66,277,165],{},[48,279,280,283,286],{},[66,281,282],{},"Export",[66,284,285],{},"Data export",[66,287,288],{},"destination",[18,290,292],{"id":291},"the-component-finder","The Component Finder",[14,294,295,296,300],{},"SimFusion does not have a marketplace — it ships with a ",[297,298,299],"strong",{},"library of components"," you search with the built-in Component Finder:",[302,303,304,308,311,314],"ol",{},[305,306,307],"li",{},"Open the Component Finder from the project workspace toolbar (or the block library panel)",[305,309,310],{},"Search by name, category, or function (e.g. \"butterworth\", \"control\", \"import\")",[305,312,313],{},"Read the block's documentation inline — every block is well documented",[305,315,316],{},"Drag the block straight into your project workspace",[14,318,319],{},"When the library doesn't have what you need, write your own block in C\u002FC++ or Python.",[18,321,323],{"id":322},"creating-custom-blocks","Creating Custom Blocks",[14,325,326,327,330],{},"Custom processing blocks are written in ",[297,328,329],{},"C\u002FC++ & Python",", directly in the built-in IDE.",[37,332,334],{"id":333},"python-template","Python Template",[26,336,340],{"className":337,"code":338,"language":339,"meta":35,"style":35},"language-python shiki shiki-themes github-light github-dark","from simfusion import Block, Input, Output, Parameter\nimport numpy as np\n\nclass MyCustomBlock(Block):\n    \"\"\"Description of what this block does.\"\"\"\n\n    # Define ports\n    input_signal = Input(type=\"data\", description=\"Input signal\")\n    gain_factor = Parameter(type=\"float\", default=1.0, description=\"Gain multiplier\")\n\n    output_signal = Output(type=\"data\", description=\"Amplified signal\")\n\n    def process(self, input_signal):\n        \"\"\"Main processing function called each tick.\"\"\"\n        amplified = input_signal * self.gain_factor\n        return {\"output_signal\": amplified}\n","python",[33,341,342,350,356,363,369,375,380,386,392,398,403,409,414,420,426,432],{"__ignoreMap":35},[343,344,347],"span",{"class":345,"line":346},"line",1,[343,348,349],{},"from simfusion import Block, Input, Output, Parameter\n",[343,351,353],{"class":345,"line":352},2,[343,354,355],{},"import numpy as np\n",[343,357,359],{"class":345,"line":358},3,[343,360,362],{"emptyLinePlaceholder":361},true,"\n",[343,364,366],{"class":345,"line":365},4,[343,367,368],{},"class MyCustomBlock(Block):\n",[343,370,372],{"class":345,"line":371},5,[343,373,374],{},"    \"\"\"Description of what this block does.\"\"\"\n",[343,376,378],{"class":345,"line":377},6,[343,379,362],{"emptyLinePlaceholder":361},[343,381,383],{"class":345,"line":382},7,[343,384,385],{},"    # Define ports\n",[343,387,389],{"class":345,"line":388},8,[343,390,391],{},"    input_signal = Input(type=\"data\", description=\"Input signal\")\n",[343,393,395],{"class":345,"line":394},9,[343,396,397],{},"    gain_factor = Parameter(type=\"float\", default=1.0, description=\"Gain multiplier\")\n",[343,399,401],{"class":345,"line":400},10,[343,402,362],{"emptyLinePlaceholder":361},[343,404,406],{"class":345,"line":405},11,[343,407,408],{},"    output_signal = Output(type=\"data\", description=\"Amplified signal\")\n",[343,410,412],{"class":345,"line":411},12,[343,413,362],{"emptyLinePlaceholder":361},[343,415,417],{"class":345,"line":416},13,[343,418,419],{},"    def process(self, input_signal):\n",[343,421,423],{"class":345,"line":422},14,[343,424,425],{},"        \"\"\"Main processing function called each tick.\"\"\"\n",[343,427,429],{"class":345,"line":428},15,[343,430,431],{},"        amplified = input_signal * self.gain_factor\n",[343,433,435],{"class":345,"line":434},16,[343,436,437],{},"        return {\"output_signal\": amplified}\n",[37,439,441],{"id":440},"block-configuration","Block Configuration",[26,443,447],{"className":444,"code":445,"language":446,"meta":35,"style":35},"language-yaml shiki shiki-themes github-light github-dark","# block.yaml\nname: \"MyCustomBlock\"\ncategory: \"Signal Processing\"\nicon: \"waveform\"\ninputs:\n  input_signal:\n    type: data\n    required: true\noutputs:\n  output_signal:\n    type: data\nparameters:\n  gain_factor:\n    type: float\n    default: 1.0\n    min: 0.0\n    max: 100.0\n","yaml",[33,448,449,455,469,479,489,497,504,514,525,532,539,547,554,561,570,580,590],{"__ignoreMap":35},[343,450,451],{"class":345,"line":346},[343,452,454],{"class":453},"sJ8bj","# block.yaml\n",[343,456,457,461,465],{"class":345,"line":352},[343,458,460],{"class":459},"s9eBZ","name",[343,462,464],{"class":463},"sVt8B",": ",[343,466,468],{"class":467},"sZZnC","\"MyCustomBlock\"\n",[343,470,471,474,476],{"class":345,"line":358},[343,472,473],{"class":459},"category",[343,475,464],{"class":463},[343,477,478],{"class":467},"\"Signal Processing\"\n",[343,480,481,484,486],{"class":345,"line":365},[343,482,483],{"class":459},"icon",[343,485,464],{"class":463},[343,487,488],{"class":467},"\"waveform\"\n",[343,490,491,494],{"class":345,"line":371},[343,492,493],{"class":459},"inputs",[343,495,496],{"class":463},":\n",[343,498,499,502],{"class":345,"line":377},[343,500,501],{"class":459},"  input_signal",[343,503,496],{"class":463},[343,505,506,509,511],{"class":345,"line":382},[343,507,508],{"class":459},"    type",[343,510,464],{"class":463},[343,512,513],{"class":467},"data\n",[343,515,516,519,521],{"class":345,"line":388},[343,517,518],{"class":459},"    required",[343,520,464],{"class":463},[343,522,524],{"class":523},"sj4cs","true\n",[343,526,527,530],{"class":345,"line":394},[343,528,529],{"class":459},"outputs",[343,531,496],{"class":463},[343,533,534,537],{"class":345,"line":400},[343,535,536],{"class":459},"  output_signal",[343,538,496],{"class":463},[343,540,541,543,545],{"class":345,"line":405},[343,542,508],{"class":459},[343,544,464],{"class":463},[343,546,513],{"class":467},[343,548,549,552],{"class":345,"line":411},[343,550,551],{"class":459},"parameters",[343,553,496],{"class":463},[343,555,556,559],{"class":345,"line":416},[343,557,558],{"class":459},"  gain_factor",[343,560,496],{"class":463},[343,562,563,565,567],{"class":345,"line":422},[343,564,508],{"class":459},[343,566,464],{"class":463},[343,568,569],{"class":467},"float\n",[343,571,572,575,577],{"class":345,"line":428},[343,573,574],{"class":459},"    default",[343,576,464],{"class":463},[343,578,579],{"class":523},"1.0\n",[343,581,582,585,587],{"class":345,"line":434},[343,583,584],{"class":459},"    min",[343,586,464],{"class":463},[343,588,589],{"class":523},"0.0\n",[343,591,593,596,598],{"class":345,"line":592},17,[343,594,595],{"class":459},"    max",[343,597,464],{"class":463},[343,599,600],{"class":523},"100.0\n",[18,602,604],{"id":603},"debugging-blocks-in-a-simulation","Debugging Blocks in a Simulation",[14,606,607],{},"Use the simulation debug tools while your model runs:",[609,610,611,617,623],"ul",{},[305,612,613,616],{},[297,614,615],{},"Breakpoints",": Pause the simulation at a time (in seconds) or at an exact sample",[305,618,619,622],{},[297,620,621],{},"Buffer inspection",": Inspect any block's input\u002Foutput buffers at the paused point",[305,624,625,628],{},[297,626,627],{},"Block documentation",": Open a block's docs directly from the project workspace when something behaves unexpectedly",[18,630,632],{"id":631},"block-styling","Block Styling",[37,634,636],{"id":635},"custom-appearance","Custom Appearance",[26,638,640],{"className":337,"code":639,"language":339,"meta":35,"style":35},"class StyledBlock(Block):\n    style = {\n        \"color\": \"#4BA6A1\",\n        \"shape\": \"rectangle\",  # or \"circle\", \"diamond\"\n        \"icon\": \"custom_icon.svg\",\n        \"width\": 120,\n        \"height\": 80\n    }\n",[33,641,642,647,652,657,662,667,672,677],{"__ignoreMap":35},[343,643,644],{"class":345,"line":346},[343,645,646],{},"class StyledBlock(Block):\n",[343,648,649],{"class":345,"line":352},[343,650,651],{},"    style = {\n",[343,653,654],{"class":345,"line":358},[343,655,656],{},"        \"color\": \"#4BA6A1\",\n",[343,658,659],{"class":345,"line":365},[343,660,661],{},"        \"shape\": \"rectangle\",  # or \"circle\", \"diamond\"\n",[343,663,664],{"class":345,"line":371},[343,665,666],{},"        \"icon\": \"custom_icon.svg\",\n",[343,668,669],{"class":345,"line":377},[343,670,671],{},"        \"width\": 120,\n",[343,673,674],{"class":345,"line":382},[343,675,676],{},"        \"height\": 80\n",[343,678,679],{"class":345,"line":388},[343,680,681],{},"    }\n",[18,683,685],{"id":684},"performance-optimization","Performance Optimization",[37,687,689],{"id":688},"vectorization","Vectorization",[14,691,692],{},"Always use NumPy\u002Fvectorized operations:",[26,694,696],{"className":337,"code":695,"language":339,"meta":35,"style":35},"# Good: Vectorized\noutput = input_array * 2 + 1\n\n# Bad: Loop-based\noutput = np.array([x * 2 + 1 for x in input_array])\n",[33,697,698,703,708,712,717],{"__ignoreMap":35},[343,699,700],{"class":345,"line":346},[343,701,702],{},"# Good: Vectorized\n",[343,704,705],{"class":345,"line":352},[343,706,707],{},"output = input_array * 2 + 1\n",[343,709,710],{"class":345,"line":358},[343,711,362],{"emptyLinePlaceholder":361},[343,713,714],{"class":345,"line":365},[343,715,716],{},"# Bad: Loop-based\n",[343,718,719],{"class":345,"line":371},[343,720,721],{},"output = np.array([x * 2 + 1 for x in input_array])\n",[37,723,725],{"id":724},"caching","Caching",[14,727,728],{},"Cache expensive computations:",[26,730,732],{"className":337,"code":731,"language":339,"meta":35,"style":35},"from functools import lru_cache\n\n@lru_cache(maxsize=128)\ndef expensive_calculation(params):\n    ...\n",[33,733,734,739,743,748,753],{"__ignoreMap":35},[343,735,736],{"class":345,"line":346},[343,737,738],{},"from functools import lru_cache\n",[343,740,741],{"class":345,"line":352},[343,742,362],{"emptyLinePlaceholder":361},[343,744,745],{"class":345,"line":358},[343,746,747],{},"@lru_cache(maxsize=128)\n",[343,749,750],{"class":345,"line":365},[343,751,752],{},"def expensive_calculation(params):\n",[343,754,755],{"class":345,"line":371},[343,756,757],{},"    ...\n",[18,759,761],{"id":760},"further-reading","Further Reading",[609,763,764],{},[305,765,766,771],{},[767,768,770],"a",{"href":769},"\u002Fdocumentation\u002Fapi","API Reference"," — Complete API documentation",[773,774,775],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":35,"searchDepth":352,"depth":352,"links":777},[778,781,786,787,791,792,795,799],{"id":20,"depth":352,"text":21,"children":779},[780],{"id":39,"depth":358,"text":40},{"id":99,"depth":352,"text":100,"children":782},[783,784,785],{"id":103,"depth":358,"text":104},{"id":168,"depth":358,"text":169},{"id":230,"depth":358,"text":231},{"id":291,"depth":352,"text":292},{"id":322,"depth":352,"text":323,"children":788},[789,790],{"id":333,"depth":358,"text":334},{"id":440,"depth":358,"text":441},{"id":603,"depth":352,"text":604},{"id":631,"depth":352,"text":632,"children":793},[794],{"id":635,"depth":358,"text":636},{"id":684,"depth":352,"text":685,"children":796},[797,798],{"id":688,"depth":358,"text":689},{"id":724,"depth":358,"text":725},{"id":760,"depth":352,"text":761},"Reference","Built-in blocks, custom block development, and the Component Finder","md",{},"\u002Fdocumentation\u002Fblock-system",{"title":5,"description":801},"stable","documentation\u002Fblock-system","x-CSTfmRvGVSLEueA2gH13ruH6U9-KjmUiiCkiwbBgw",[810,813,816,819,820],{"title":811,"path":812,"order":346},"Getting Started","\u002Fdocumentation\u002Fgetting-started",{"title":814,"path":815,"order":352},"Core Concepts","\u002Fdocumentation\u002Fcore-concepts",{"title":817,"path":818,"order":358},"Understanding Signals","\u002Fdocumentation\u002Fcore-concepts\u002Fsignals",{"title":5,"path":804,"order":365},{"title":770,"path":769,"order":371},1784562699566]