{
  "schemaVersion": 1,
  "kind": "deterministic-teaching-model",
  "assumptions": [
    "One link direction, fixed frame size, continuously ready sender, fixed credit-return time measured from spending a credit until reuse.",
    "bitRate counts only the bits represented by frameBytes; it is not a Fibre Channel product label, physical line rate or application goodput.",
    "No wire overhead, credit loss, bursts, shared pools, downstream contention or variable processing time is modeled.",
    "Utilization is the idealized long-run fraction of the assumed sending rate, not a measured device result."
  ],
  "formula": "framesPerSecond = bitRate / (8 * frameBytes); requiredCredits = ceil(framesPerSecond * returnMicroseconds / 1e6); utilization = min(1, credits / windowFrames)",
  "cases": [
    {
      "label": "Reference",
      "bitRate": 16000000000,
      "frameBytes": 2000,
      "returnMicroseconds": 100,
      "credits": 64,
      "framesPerSecond": 1000000,
      "windowFrames": 100,
      "requiredCredits": 100,
      "utilization": 0.64
    },
    {
      "label": "Half-sized frames",
      "bitRate": 16000000000,
      "frameBytes": 1000,
      "returnMicroseconds": 100,
      "credits": 64,
      "framesPerSecond": 2000000,
      "windowFrames": 200,
      "requiredCredits": 200,
      "utilization": 0.32
    },
    {
      "label": "Twice the bit rate",
      "bitRate": 32000000000,
      "frameBytes": 2000,
      "returnMicroseconds": 100,
      "credits": 64,
      "framesPerSecond": 2000000,
      "windowFrames": 200,
      "requiredCredits": 200,
      "utilization": 0.32
    },
    {
      "label": "Longer credit return",
      "bitRate": 16000000000,
      "frameBytes": 2000,
      "returnMicroseconds": 150,
      "credits": 64,
      "framesPerSecond": 1000000,
      "windowFrames": 150,
      "requiredCredits": 150,
      "utilization": 0.4266666666666667
    },
    {
      "label": "Larger window",
      "bitRate": 16000000000,
      "frameBytes": 2000,
      "returnMicroseconds": 100,
      "credits": 100,
      "framesPerSecond": 1000000,
      "windowFrames": 100,
      "requiredCredits": 100,
      "utilization": 1
    }
  ]
}
