{
  "slug": "write-once-memory-code",
  "term": "Write-once memory code",
  "aliases": [
    "WOM code",
    "WOM coding"
  ],
  "definition": "A write-once memory code represents successive logical values using physical states that change only in a permitted direction between resets.",
  "note": "The classical binary model starts with zero bits and permits only zero-to-one transitions; this labels abstract states, not every NAND voltage mapping. A three-bit construction supports two successive two-bit messages, while decoding recovers the current value rather than both messages. [rivest1982]\n\nReusable SSD places expanded second-write data in over-provisioned space; its SSD performance evaluation uses trace-driven simulation. Additional logical writes, resident capacity and erase counts are separate quantities. [yadgar2015]\n\nThe three-bit teaching code is not an error-correcting code. Every physical state decodes. Across its eight states, all 24 single-bit flips change the decoded value without rejection. This state-space check is not a physical error-rate estimate. [hesela-wom]\n\nHardware reprogramming depends on the NAND part and programming sequence. A valid code alone does not certify device support or endurance. In the 2016 hardware study, the OpenSSD FTL omits actual WOM encoding/decoding, writes arbitrary reused-page data and ignores ECC on those reads. Coding costs and failures are modeled; this does not validate end-to-end WOM payload recovery. [margaglia2016]\n\nVoltage-based WOM-v coding targets ordered cell levels. Its FEMU/LightNVM evaluation changes cell-to-page assignment; the No-Read mode tracks page generations and gives up same-generation transitions. This is a research design, not a standard host command. [jaffer2022]",
  "status": "research",
  "advantages": [
    {
      "text": "Permits more than one logical value to be written before the modeled physical medium must be reset.",
      "citationIds": [
        "rivest1982"
      ]
    }
  ],
  "limitations": [
    {
      "text": "Coding expansion, metadata, error correction and permitted programming operations must be evaluated together.",
      "citationIds": [
        "yadgar2015",
        "margaglia2016",
        "jaffer2022"
      ]
    }
  ],
  "related": [
    "nand-page",
    "nand-erase-block",
    "ftl",
    "over-provisioning",
    "write-amplification"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": {
    "date": "1982",
    "citationIds": [
      "rivest1982"
    ]
  },
  "lastSeen": null,
  "updated": "2026-11-01",
  "citations": [
    {
      "id": "rivest1982",
      "title": "Rivest and Shamir. How to Reuse a Write-Once Memory. Information and Control 55 (1982), Table 1 and Lemma 1.",
      "url": "https://people.csail.mit.edu/rivest/pubs/RS82c.pdf",
      "accessed": "2026-11-01"
    },
    {
      "id": "yadgar2015",
      "title": "Yadgar, Yaakobi and Schuster. Write Once, Get 50% Free: Saving SSD Erase Costs Using WOM Codes. FAST 2015, sections 2.2 and 6.",
      "url": "https://www.usenix.org/system/files/conference/fast15/fast15-paper-yadgar.pdf",
      "accessed": "2026-11-01"
    },
    {
      "id": "margaglia2016",
      "title": "Margaglia et al. The Devil Is in the Details: Implementing Flash Page Reuse with WOM Codes. FAST 2016, sections 3 and 5.1-5.2.",
      "url": "https://www.usenix.org/system/files/conference/fast16/fast16-papers-margaglia.pdf",
      "accessed": "2026-11-01"
    },
    {
      "id": "jaffer2022",
      "title": "Jaffer, Mahdaviani and Schroeder. Improving the Reliability of Next Generation SSDs using WOM-v Codes. FAST 2022; arXiv:2208.00772v1, section 3.2.",
      "url": "https://arxiv.org/pdf/2208.00772v1",
      "accessed": "2026-11-01"
    },
    {
      "id": "hesela-wom",
      "title": "Hesela: exhaustive three-bit WOM message and single-bit fault cases, assumptions and source hash",
      "url": "https://hesela.dev/research/wom-coding/results.json",
      "accessed": "2026-11-01"
    }
  ],
  "provenance": [
    "Research status refers to use as an SSD coding technique, not verified implementation in a shipping product.",
    "Hesela's executable example implements the 1982 construction; it is not a new code or a NAND experiment."
  ]
}
