// SPDX-License-Identifier: MIT // Generated by EML-lang Solidity backend // Source module: pid_controller // Source file: /home/monogate/monogate/forge/examples/pid_controller.eml // Functions: 1 (1 @verify-annotated) // Constants: 5 // WARNING: 3 fractional Real literal(s) were rounded to int256 (e.g. 0.6108 -> 1). // For fixed-point semantics, scale your EML constants // by WAD (1e18) and override the transcendental stubs // with PRBMath SD59x18 in a derived contract. pragma solidity ^0.8.20; contract PidController { int256 constant Kp = 2 /* 1.5 rounded; see header re fixed-point */; int256 constant Ki = 0 /* 0.4 rounded; see header re fixed-point */; int256 constant Kd = 0 /* 0.05 rounded; see header re fixed-point */; int256 constant OUT_MIN = (-1); int256 constant OUT_MAX = 1; /// @notice Formal proof: pid_output_clamped (MachLib). Compiled from EML-lang. /// @dev Pfaffian profile: chain_order=0, cost_class=p0-d4-w0-c0, drift_risk=LOW. /// @dev Gas estimate: ~314 gas (PRBMath SD59x18 overrides assumed; run forge gas-bench for the canonical signal). /// @param error error (int256) /// @param integral integral (int256) /// @param derivative derivative (int256) /// @dev ensures: (result >= OUT_MIN) /// @dev ensures: (result <= OUT_MAX) function pid(int256 error, int256 integral, int256 derivative) external pure returns (int256) { require(((error < 0 ? -error : error) <= 100), "pid: refinement violated on error: ((error < 0 ? -error : error) <= 100)"); require(((integral < 0 ? -integral : integral) <= 100), "pid: refinement violated on integral: ((integral < 0 ? -integral : integral) <= 100)"); require(((derivative < 0 ? -derivative : derivative) <= 100), "pid: refinement violated on derivative: ((derivative < 0 ? -derivative : derivative) <= 100)"); int256 raw = (((Kp * error) + (Ki * integral)) + (Kd * derivative)); return _clamp(raw, OUT_MIN, OUT_MAX); } /// @dev clamp helper -- min(max(x, lo), hi). function _clamp(int256 x, int256 lo, int256 hi) internal pure returns (int256) { if (x < lo) return lo; if (x > hi) return hi; return x; } }