Conformance Statement for pkg/tcsc, CCSDS 231.0-B-4
A2.1 GENERAL INFORMATION
A2.1.1 Identification of PICS
| Field | Value |
|---|---|
| Date of Statement (DD/MM/YYYY) | 25/08/2026 |
| PICS Serial Number | ASTRO-TCSC-PICS-002 |
| System Conformance Statement Cross-Reference | This document |
A2.1.2 Identification of Implementation Under Test (IUT)
| Field | Value |
|---|---|
| Implementation Name | astro/pkg/tcsc |
| Implementation Version | See go.mod / latest commit on main |
| Special Configuration | None |
| Other Information | Go library implementing CCSDS TC Synchronization and Channel Coding sublayer. Provides CLTU wrapping/unwrapping with BCH(63,56) forward error correction per codeblock (SEC and TED decoding modes), CCSDS pseudo-randomization, configurable start/tail sequences, and PLOP-1/PLOP-2 acquisition and idle sequence assembly. |
A2.1.3 Identification of Supplier
| Field | Value |
|---|---|
| Supplier | Ravi Suhag |
| Contact Point for Queries | GitHub, github.com/ravisuhag/astro |
| Implementation Name(s) and Version(s) | astro/pkg/tcsc (Go package) |
| System Name(s) | Astro |
A2.1.4 Identification of Specification
| Field | Value |
|---|---|
| Specification | CCSDS 231.0-B-4 (TC Synchronization and Channel Coding, Blue Book, Issue 4, November 2019) |
| Have any exceptions been required? | Yes [X] No [ ] |
NOTE, Non-supported optional capabilities (LDPC and convolutional coding) are identified in section A2.2. Clause references follow the Issue 4 numbering: section 3 (BCH coding), section 4 (LDPC coding), section 5 (CLTU), section 6 (randomizer), section 7 (physical layer operations procedures), section 8 (managed parameters).
NOTE: CCSDS 231.0-B-4 publishes no PICS proforma; its annex A is the service definition. This document is therefore a coverage matrix written against the clauses above, not a filled-in proforma, and the item numbers (TCSC-n) are local to this repository.
A2.2 REQUIREMENTS LIST
Table A-1: BCH(63,56) Coding (section 3)
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TCSC-1 | BCH Generator Polynomial | 3.3 | M | Yes | |
g(x) = x^7 + x^6 + x^2 + 1, represented as bchPoly = 0xC5. | |||||
| TCSC-2 | BCH Codeblock Structure | 3.2 | M | Yes | |
64 bits per codeblock: 56 information bits (7 bytes) + 7 parity bits + 1 filler bit. Constants: InfoBytes = 7, Codeblock. | |||||
| TCSC-3 | BCH Systematic Encoding with Complemented Parity | 3.3 | M | Yes | |
BCHEncode(info), 7-bit LFSR systematic encoding. The transmitted parity bits are the COMPLEMENT of the LFSR remainder (parity = ^sr & 0x7F), per the standard. Information bytes unchanged in first 7 bytes; parity in high 7 bits of the 8th byte. Pinned to the known vector: all-zeros information octets encode to last octet 0xFE. | |||||
| TCSC-4 | BCH Filler Bit | 3.3.2 | M | Yes | |
Filler bit (bit 0 of byte 7) is always '0' per 3.3.2. Pinned by Test. | |||||
| TCSC-5 | BCH Syndrome Computation | 3.5 | M | Yes | |
BCHDecode complements the received parity bits (undoing the on-the-wire inversion) before the LFSR syndrome pass over all 63 code bits. Zero syndrome indicates no errors. | |||||
| TCSC-6 | SEC Decoding Mode | 3.5 | M | Yes | |
BCHDecode() / ModeSEC corrects 1 bit error per codeblock; find searches all 63 bit positions for a syndrome match. Returns corrected information bytes and correction count. NOTE: in SEC mode a 3-bit error pattern can miscorrect; guaranteed detection of up to 3 bit errors requires TED mode. | |||||
| TCSC-7 | TED Decoding Mode | 3.5 | M | Yes | |
BCHDecode, Triple Error Detection: no correction attempted; any non-zero syndrome returns Err. Guaranteed detection of up to 3 bit errors per codeblock. Also selectable end-to-end via Unwrap. | |||||
| TCSC-8 | BCH Uncorrectable Detection | 3.5 | M | Yes | |
SEC mode returns Err when the syndrome is non-zero and no single-bit error position matches (2+ bit errors). | |||||
| TCSC-9 | BCH Error-Free Pass-Through | 3.5 | M | Yes | |
Zero syndrome: information bytes returned with 0 corrections and nil error. | |||||
Table A-2: Pseudo-Randomization (section 6)
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TCSC-10 | PN Sequence Generation | 6.2 | M | Yes | |
Generate, 8-bit LFSR, h(x) = x^8 + x^6 + x^4 + x^3 + x^2 + x + 1, preset to all ones. Pinned to the published first 40 digits (0xFF 0x39 0x9E 0x5A 0x68). This is the TC polynomial; the TM randomizer of CCSDS 131.0-B-5 clause 10.4.2 is a different sequence and is not used here. | |||||
| TCSC-11 | Randomization (Send) | 6.3 | M | Yes | |
Randomize(data) XORs data with the PN sequence. Returns new slice; input not modified. | |||||
| TCSC-12 | De-Randomization (Receive) | 6.3 | M | Yes | |
Same Randomize() function, XOR is self-inverse. Integrated into UnwrapCLTU() when randomize=true. | |||||
| TCSC-13 | Randomization Coverage in the CLTU | 6.3 | M | Yes | |
WrapCLTU() pads to the codeblock boundary with 0x55 fill FIRST, then randomizes the padded buffer, so the fill octets go out randomized like the rest of the data. UnwrapCLTU() de-randomizes the full recovered buffer (fill included). Pinned by Test. | |||||
Table A-3: CLTU (section 5)
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TCSC-14 | CLTU Start Sequence | 5.2.2 | M | Yes | |
Default returns the standard 2-byte start sequence 0xEB90. Custom sequences supported via WrapCLTU() parameter. | |||||
| TCSC-15 | CLTU Tail Sequence | 5.2.4 | M | Yes | |
Default returns the standard 8-byte tail sequence 0x | |||||
| TCSC-16 | CLTU Assembly (Send) | 5.2 | M | Yes | |
Wrap: 0x55 padding to the 7-byte boundary, optional randomization of the padded buffer, BCH encoding of each block, start sequence prepend, tail sequence append. | |||||
| TCSC-17 | CLTU Data Padding | 3.4, 5.2 | M | Yes | |
Frame data padded to a multiple of InfoBytes (7) with the fill data of 3.4 (0x55 octets) before randomization and BCH encoding, as part of CLTU assembly. | |||||
| TCSC-18 | CLTU Reception and Termination | 5.3 | M | Yes | |
UnwrapCLTU() / Unwrap: validates the start sequence, decodes codeblocks, and terminates on the tail sequence or on the FIRST codeblock that fails to decode, an exact tail match is not required, so bit errors in the tail are tolerated. Trailing octets after the CLTU are ignored. | |||||
| TCSC-19 | Start Sequence Validation | 5.3 | M | Yes | |
UnwrapCLTU() validates the start sequence; returns Err otherwise. | |||||
| TCSC-20 | Minimum Length Validation | 5.3 | M | Yes | |
UnwrapCLTU() requires at least the start sequence plus one codeblock; returns Err otherwise. | |||||
Table A-4: Acquisition, Idle, and PLOP (section 7)
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TCSC-21 | Acquisition Sequence | 7.2.2 | M | Yes | |
Acquisition, alternating '01' pattern (0x55 octets); defaults to the recommended minimum of 16 octets (128 bits). | |||||
| TCSC-22 | Idle Sequence | 7.2.4 | M | Yes | |
Idle, alternating '01' pattern between CLTUs. The length is unconstrained by 7.2.4 and is a managed parameter; Default is this library's practical default, not a requirement. | |||||
| TCSC-23 | PLOP-1 | 7.4 | M | Yes | |
Uplink, each CLTU preceded by its own acquisition sequence (session ends after each CLTU). | |||||
| TCSC-24 | PLOP-2 | 7.5 | M | Yes | |
Uplink, one acquisition sequence starts the session; idle sequence keeps the channel modulated between CLTUs. CCSDS-recommended procedure. | |||||
| TCSC-25 | Carrier Modulation Modes (CMM state machine) | 7 | M | No | |
The CMM-1..CMM-4 state machine itself is not modeled; the library assembles the symbol stream (acquisition/ | |||||
Table A-5: Optional Coding Schemes
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TCSC-26 | LDPC Coding | 4 | O | No | Not implemented. |
| TCSC-27 | Concatenated BCH + Convolutional | - | O | No | Convolutional inner code not implemented. BCH outer code is available. |
A2.3 CONFORMANCE SUMMARY
Overall Statistics
| Category | Total Items | Supported | Not Supported |
|---|---|---|---|
| Mandatory (M) | 25 | 24 | 1 |
| Optional (O) | 2 | 0 | 2 |
| Total | 27 | 24 | 3 |
Non-Conformances (Mandatory Items Not Supported)
| Item | Description | Reason |
|---|---|---|
| TCSC-25 | CMM state machine | |
The library produces the physical-channel symbol stream ( Uplink) but does not model the carrier modulation mode transitions; carrier on/off control belongs to the transmitting equipment, not to a codec library. | ||
Non-Supported Optional Items
| Item | Description | Reason |
|---|---|---|
| TCSC-26 | LDPC Coding | Not implemented. Specialized application for high-data-rate TC links. |
| TCSC-27 | Concatenated BCH + Convolutional | Convolutional inner code not implemented. |
Key Implementations
| Area | Items | Implementation |
|---|---|---|
| BCH(63,56) Coding | TCSC-1-9 | |
BCHEncode() (complemented parity, filler '0', all-zeros -> 0xFE vector), BCHDecode() / BCHDecode with SEC and TED modes. | ||
| Pseudo-Randomization | TCSC-10-13 | |
Generate, Randomize(); fill-then-randomize order in WrapCLTU(). | ||
| CLTU | TCSC-14-20 | |
WrapCLTU(), UnwrapCLTU() / Unwrap terminating on the first failed codeblock. | ||
| Acquisition/ | TCSC-21-24 | |
Acquisition, Idle, Uplink for PLOP-1 and PLOP-2. | ||
Wire test vectors
The octets backing this statement live in the vector corpus — 13 vectors. Each vector names the clause it comes from and carries the derivation that produced it.
| File | |
|---|---|
tcsc/bch.json | 7 vectors |
tcsc/interop.json | 6 vectors, captured from Yamcs 5.13.5 |
These are data files, so any implementation can check itself against the same octets. See CONTRACT.md for how, and how this is verified for what rests on a published vector versus a reading of the clause.