Skip to main content

openc166

An open-source assembler for the Infineon C166 and C167 microcontroller family (including ST10 parts), compatible with the Keil A166 assembler.

It turns Keil-style assembly source into a raw binary image at a fixed address, or into an Intel HEX or Motorola S-record file. That suits small programs loaded into RAM or flash and started directly, such as ECU payloads, bootstrap loaders, and test code. No linker or object-file converter is needed.

openc166 runs on Linux, Windows and macOS. It needs only a C++20 compiler and CMake.

Status

Early development (version 0.x). What works today:

  • The complete C166 and C167 instruction set, with all addressing modes. Every instruction form is checked byte for byte against Keil A166 V5.38: over 5,000 checks of code bytes, addresses and symbol values, all identical.
  • Keil expression syntax: operators, HIGH/LOW, SOF/SEG/PAG/POF, BOF, DATA3/DATA4/DATA8/DATA16, character constants, bit addresses such as PSW.3 or 0FD00H.5, and extended-SFR checks inside EXTR sequences.
  • Sections with an address (SECTION CODE AT 0E000H) and without one. openc166 places sections without AT as Keil's L166 linker would, or at addresses you give (--section NAME=ADDR), so code that leaves placement to the linker can still be assembled straight to a binary. DGROUP and CGROUP keep sections in one data page or code segment, as in L166. BIT sections and DBIT hold bit variables, placed bit by bit as L166 places them.
  • PROC/ENDP, ORG, EVEN, EQU/SET/BIT, DB/DW/DD, DS/DSB/DSW/DSD, and DPPTR/DSPTR/DBPTR, including Keil's automatic alignment of word data.
  • Segmented mode ($SEGMENTED): ASSUME, DPPn: prefixes, and Keil's rules for which data page register an address goes through.
  • DEFR/DEFA/DEFB, the register-definition directives that register files use, with Keil's rules for repeated definitions.
  • A built-in REG167.INC register file, written from Infineon's manuals, so $INCLUDE(REG167.INC) works without Keil installed.
  • Keil's rules for label arithmetic, which decide between short and long instruction forms.
  • Generic JMP and CALL: like Keil, openc166 picks the shortest instruction that reaches the target and shortens forward jumps over several passes. Label types (NEAR, FAR, WORD, ...) and the SHORT and type operators (FAR x, WORD PTR x, ...) work as in Keil.
  • $INCLUDE and $INCDIR, with Keil's search order and listing format.
  • Conditional assembly: $SET/$RESET, $IF/$ELSEIF/$ELSE/$ENDIF and the IF/ELSEIF/ELSE/ENDIF statements, with Keil's quirks (only bit 0 of a condition counts) and listing format.
  • LIT text replacement (PORT LIT 'R2'), with Keil's rules for where names are replaced.
  • Keil's standard macros: MACRO/ENDM with parameters and LOCAL labels, REPT, IRP, IRPC, EXITM, NUL, & and %, with Keil's rules for splitting arguments. $GEN/$NOGEN choose whether the listing shows expanded lines.
  • The $MOD167, $CASE, $SEGMENTED and $TABS controls, with Keil's rule that these come before the first statement. Listing-only controls are accepted and ignored.
  • Keil error and warning codes (A74, A111, ...), so messages line up with the Keil manual.
  • Raw binary, Intel HEX and Motorola S-record output. The HEX records match Keil OH166's H167 format.
  • Several source files linked into one program, as L166 does: EXTERN, PUBLIC and GLOBAL symbols, and sections of the same name combined across files. Each file is assembled separately (a "module"), so a name that is not PUBLIC stays private to its file.
  • Register banks (REGBANK/REGDEF), placed in 0FC00H..0FDFFH as L166 places them, and the NAME, SSKDEF, PECDEF and TYPEDEC directives.
  • TASKING sources (--dialect tasking): the common part of TASKING's m166 preprocessor (@SET, @EVAL, @IF/@ELSE/@ENDI, @DEFINED), TASKING's controls and STDNAMES register files, and the places where its assembler differs from Keil's. Infineon's MiniMon monitor and flash drivers, which gkflasher's ECU code comes from, rebuild byte for byte from their TASKING sources. See docs/tasking.md.
  • A Python package and a C API, for tools that assemble code themselves.

Not done yet:

  • Keil's MPL macro language (%DEFINE and the like); put $NOMPL at the top of the file to use % as text
  • OMF-166 object files and libraries
  • TASKING's m166 macros with parameters (@DEFINE), loops and string functions

See docs/compatibility.md for exact behaviour and the few places where openc166 deliberately differs from Keil.

Building

cmake -S . -B build
cmake --build build
ctest --test-dir build

The program is build/cli/openc166. On Windows with Visual Studio it is under build\cli\Debug\ or build\cli\Release\. The shared library with the C API is built in build/src/.

Usage

openc166 payload.a66                       # writes payload.bin
openc166 payload.a66 -o out.bin -l out.lst # choose names, add a listing
openc166 payload.a66 -o payload.hex        # Intel HEX
openc166 payload.a66 -o payload.s19        # S-records (S1)
openc166 main.a66 lib.a66 -o payload.bin   # link two source files

Several source files are linked into one program, the way Keil's L166 linker joins the object files of A166:

  • An EXTERN name in one file takes the value of the PUBLIC or GLOBAL name in another. A name that no file exports is an error.
  • Sections with the same name and class are joined into one: the parts of a PUBLIC or GLOBAL section follow one another, the parts of a COMMON section lie on top of each other.
  • Without -o, the output is named after the first file. With -l, the listing has one part per file and a symbol table that names the file each symbol comes from.
  • Code outside sections starts at --origin in every file, so normally each file puts its code in sections.

$INCLUDE looks in each file's own directory. docs/compatibility.md has the exact rules.

The output format follows the extension of the -o file: .hex, .h86 and .ihx give Intel HEX; .srec, .s19, .s28, .s37, .mot and .sx give S-records; anything else gives a raw binary. --format chooses it explicitly.

A raw binary starts at the lowest address used. For example, code in SECTION CODE AT 0E000H produces a file whose first byte belongs at 0E000H. Gaps between pieces of code are filled. HEX and S-record files carry the address of every record, so they hold only the bytes used.

Option Meaning
-f, --format FMT bin, hex or srec (default: from the output extension)
--origin ADDR address of code outside sections, and the lowest address for sections without AT (default 0)
--section NAME=ADDR put section NAME, which has no AT, at ADDR (may be repeated)
--base ADDR binary: address of the first byte of the file
--fill BYTE binary: value of gaps between pieces of code (default 0FFh)
--record-size N HEX and S-records: data bytes per record (default 16)
--cpu c166|c167 instruction set ($MOD167 in the source also selects C167)
-I DIR also search DIR for $INCLUDE files (may be repeated)
--dialect D keil (default) or tasking, for TASKING a166 sources
-c, --control TEXT controls read before the sources, e.g. -c "CASE STDNAMES(reg167.def)" (may be repeated)

Sections without AT go in order of first appearance to the first free, suitably aligned place from the origin on, as L166 places them by default. --section overrides that for chosen sections, like L166's SECTIONS control. The listing ends with a table of where each section went. examples/sections.a66 shows both.

Intel HEX files use extended linear address records (type 04) for addresses above 64 KB, like OH166 with its H167 option. S-records use S1, S2 or S3 records by extension (.s19, .s28, .s37); otherwise the smallest kind that holds every address.

The exit status is 0 on success, 1 on assembly errors (no output is written), and 2 for usage or file errors. Messages use the format file:line:column: error A74: ....

examples/payload.a66 is a short, commented example. examples/mtos/ holds real ECU payloads for Siemens SIMK43 ECUs, taken from gkflasher.

Python

pip install openc166     # or "pip install ." in a checkout

Wheels are published for Linux, Windows and macOS on x86 and ARM, including 32-bit and 64-bit Raspberry Pi OS (on a Raspberry Pi 2 or newer); other systems build from source, which needs CMake and a C++20 compiler. To get just the openc166 command, pipx install openc166 works too.

import openc166

result = openc166.assemble("""
$MOD167
PROG    SECTION CODE AT 0E000H
        MOV     R4, #0BEEFH
        RET
PROG    ENDS
        END
""")
image = result.image()     # raises openc166.AssemblyError if there are errors
image.base                 # 0xE000, the address of image.data[0]
image.data                 # b'\xe6\xf4\xef\xbe\xcb\x00'
  • openc166.assemble(source, *, file_name=None, cpu=None, origin=0, include_dirs=(), sections=None, dialect="keil", controls=()) assembles a str or bytes. sections gives addresses for sections without AT, e.g. {"VARS": 0xF600}. dialect="tasking" reads TASKING source; controls is a list of controls read before the source, as with -c. openc166.assemble_file(path, ...) reads a file; $INCLUDE then also searches the file's directory.
  • The result has ok, diagnostics (each with severity, code, message, file, line, column; str() gives the usual one-line message), errors, warnings, chunks (address and bytes of each piece of code), symbols (a dict of name to Symbol), symbol(name) (lookup ignoring case), sections (a dict of name to Section: type, align, address, size, and placement, which is "at", "given" or "located"), listing and cpu.
  • openc166.assemble_many({"main.a66": text1, "lib.a66": text2}, ...) links several sources into one program, like several files on the command line; openc166.assemble_files([path1, path2], ...) reads them from files. Each Symbol then says which file defines it (module) and whether it is PUBLIC or GLOBAL (exported). result.modules lists the file names; result.symbols holds one symbol per name (the exported one if there is one), result.all_symbols all of them. Each Section has its class_name and group.
  • result.image(base=None, fill=0xFF) lays all code out as one block, like the command-line tool.
  • result.intel_hex(record_size=16) and result.srec(record_size=16, address_size=None) return Intel HEX and S-record text (address_size 2, 3 or 4 picks S1, S2 or S3 records).

The package needs Python 3.9 or newer. It also installs the openc166 command. It loads the library through ctypes, so one wheel works with every Python version.

C API

include/openc166/openc166.h declares a plain C interface, exported by the shared library (libopenc166.so, libopenc166.dylib or openc166.dll). Any language that can call C can use it: oc166_assemble assembles one source, oc166_assemble_many links several. The header documents every function; the Python package is an example of a complete binding.

Testing

  • ctest --test-dir build runs the unit tests, the C API test and the Python package tests, and assembles the examples, checking every byte.

  • tests/acceptance/minimon.py rebuilds Infineon's MiniMon from its TASKING sources and compares the result with its HEX files. MiniMon is not included; set MINIMON_DIR to its directory (the one that holds MCPROG and Driver) and ctest runs it too.

  • tests/diff/ contains the differential test against Keil A166. Keil is not included. If you have your own copy, run:

    KEIL_A166=/path/to/A166.EXE python3 tests/diff/keil_diff.py tests/diff/cases/*.a66
    

    It compares every line: address, code bytes, warnings and errors, and the final value of every symbol. Add --image to also link Keil's output with L166 and OH166 and compare the complete memory image, and --codes to list lines where both assemblers report an error but with different codes. Lines marked ; DIVERGES: are deliberate differences (see docs/compatibility.md) and are skipped.

    Given a directory instead of a file, it treats each .a66 file in it as one module, links Keil's objects with L166, and compares the linked image and the linker's errors with openc166's:

    KEIL_A166=/path/to/A166.EXE python3 tests/diff/keil_diff.py tests/diff/cases/link/*/
    

    On Linux and macOS, Keil runs under Wine. To generate test lines that cover the whole instruction set, run tests/diff/gen_sweep.py build/generated/openc166/isa.json c167 > sweep.a66.

    The test inputs were written independently for this project. Keil's output is used only for the local comparison and is never stored in the repository.

License

MIT; see LICENSE. The bundled doctest test framework is also MIT.

openc166 is not affiliated with Arm/Keil or Infineon. "Keil", "A166", "C166", "C167" and "TASKING" are trademarks of their respective owners. The names are used only to describe compatibility.

Metadata

Release files for openc166 0.1.16

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for openc166 0.1.16
File Size Uploaded Provenance Actions
openc166-0.1.16.tar.gz 330.4 kB With provenance Details for openc166-0.1.16.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for openc166 0.1.16
File Actions
openc166-0.1.16-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details for openc166-0.1.16-py3-none-win_arm64.whl
openc166-0.1.16-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for openc166-0.1.16-py3-none-win_amd64.whl
openc166-0.1.16-py3-none-win32.whl Python 3 none Windows x86-32 Details for openc166-0.1.16-py3-none-win32.whl
openc166-0.1.16-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details for openc166-0.1.16-py3-none-musllinux_1_2_x86_64.whl
openc166-0.1.16-py3-none-musllinux_1_2_armv7l.whl Python 3 none Linux musl 1.2+ ARMv7l Details for openc166-0.1.16-py3-none-musllinux_1_2_armv7l.whl
openc166-0.1.16-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details for openc166-0.1.16-py3-none-musllinux_1_2_aarch64.whl
openc166-0.1.16-py3-none-manylinux_2_31_armv7l.whl Python 3 none Linux glibc 2.31+ ARMv7l Details for openc166-0.1.16-py3-none-manylinux_2_31_armv7l.whl
openc166-0.1.16-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for openc166-0.1.16-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
openc166-0.1.16-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64, Linux glibc 2.24+ ARM64 Details for openc166-0.1.16-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
openc166-0.1.16-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for openc166-0.1.16-py3-none-macosx_11_0_arm64.whl
openc166-0.1.16-py3-none-macosx_10_15_x86_64.whl Python 3 none macOS 10.15+ x86-64 Details for openc166-0.1.16-py3-none-macosx_10_15_x86_64.whl

Total release size: 11.0 MB

Release files / openc166-0.1.16.tar.gz

Download URL openc166-0.1.16.tar.gz
Size 330.4 kB
Tags Source
SHA-256 checksum
How to use checksums
cb8650ecb7cd6aa610cf3534339c50dccc8a9b1c4b473cf2fde49a3ad56111f7
BLAKE2b-256 checksum
How to use checksums
6b22100df26169582ee1d2f2eb0e159b35da8131347b1db8ea0ab6ef2f50b601
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-win_arm64.whl

Download URL openc166-0.1.16-py3-none-win_arm64.whl
Size 769.1 kB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
2ec80aad567ff7a582035679d5696dd5a9c1d055fed8081bdaa9410305d4e16c
BLAKE2b-256 checksum
How to use checksums
2d538a8f2e21c7229f1282e58d7086527b51ea3a6357608f174e2d607c5ca4e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-win_amd64.whl

Download URL openc166-0.1.16-py3-none-win_amd64.whl
Size 805.9 kB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
5b784dc3df56ebcd75505ab1dcfe1d526c178e89d7577f17796fe008e9d97196
BLAKE2b-256 checksum
How to use checksums
1af29565d3da6842abb3583b853a0ec47253b5fe701e77e9b7d9fc9633872b1a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-win32.whl

Download URL openc166-0.1.16-py3-none-win32.whl
Size 704.4 kB
Tags Python 3 Windows x86-32
SHA-256 checksum
How to use checksums
db87e4b84d079b56a2cfad6feccc4f2ea52fad1bc6a6519373e3b33219fe1327
BLAKE2b-256 checksum
How to use checksums
c30f91fe36f0988140c16ce7a9d4b5a0323bed5645e27b46f01591b5ee4edcf6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-musllinux_1_2_x86_64.whl

Download URL openc166-0.1.16-py3-none-musllinux_1_2_x86_64.whl
Size 1.8 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
a0015877f97ff2538990c724a107da81ab9cd857fdb56411bf16c071007316a4
BLAKE2b-256 checksum
How to use checksums
d120cd71e2fb0fa40028faf0850f8c3f0f557ce95fab57ed7abe02c356627576
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-musllinux_1_2_armv7l.whl

Download URL openc166-0.1.16-py3-none-musllinux_1_2_armv7l.whl
Size 1.5 MB
Tags Linux musl 1.2+ ARMv7l Python 3
SHA-256 checksum
How to use checksums
c742f59662a600517dc77cd44deaeb4428daa34e20467bf8c0ad509a66107b60
BLAKE2b-256 checksum
How to use checksums
020af27fa804750c31f2ce4862b3f98cc3817fd7c571b831c1ef1309bf71236c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-musllinux_1_2_aarch64.whl

Download URL openc166-0.1.16-py3-none-musllinux_1_2_aarch64.whl
Size 1.7 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
e508d62b4ba4b67cf02edf9777d91f0d05dc2eb14e877c3964637afbe6e505b8
BLAKE2b-256 checksum
How to use checksums
b0004b263a2a1fb1420d4f5b38a69c6ee5b0ae92b393c8d5183473860f920b4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-manylinux_2_31_armv7l.whl

Download URL openc166-0.1.16-py3-none-manylinux_2_31_armv7l.whl
Size 598.1 kB
Tags Linux glibc 2.31+ ARMv7l Python 3
SHA-256 checksum
How to use checksums
1662de710468645d259d7636c68b287a296ebc17a324f0e56168c3b39ff37a13
BLAKE2b-256 checksum
How to use checksums
e25b583952ce77e8d25f8a31921c05584dd356cd6a7450d493e5ed4129ffe1cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL openc166-0.1.16-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 860.7 kB
Tags Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
88258489d0299f8f170d2e1cc96bab42463209f7e9de9ad32d351cddd721f970
BLAKE2b-256 checksum
How to use checksums
0087210658e520762f9f597aad154ae52b8e86463a02f2984723971a3bafca30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL openc166-0.1.16-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 774.2 kB
Tags Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
f531c3fcfc04c75b8569ad943989cab7bb8762721aec12d082c59e78463c218d
BLAKE2b-256 checksum
How to use checksums
fe5cc250c96c3a0fdf3fa1d5b4482f3c9c748162493629a6cb48f0576e731c48
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-macosx_11_0_arm64.whl

Download URL openc166-0.1.16-py3-none-macosx_11_0_arm64.whl
Size 610.2 kB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
23886481e9a2d0e70dc02c93316e63c0cf5d13260f10e0b89e87bf8aaec2b8ae
BLAKE2b-256 checksum
How to use checksums
e38e14a124453081dee380ace22bee7e431484a32077f1095baa8ca6f7afbb31
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Release files / openc166-0.1.16-py3-none-macosx_10_15_x86_64.whl

Download URL openc166-0.1.16-py3-none-macosx_10_15_x86_64.whl
Size 654.7 kB
Tags Python 3 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
a008c74a85907bcb1108805f0d5cdd9c9fd551e017769e68f9ea5ef28521aee2
BLAKE2b-256 checksum
How to use checksums
c8ec06e38aab19a32383485b0de88300a52c0506ec5dad770985ee41e5ec0050
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

Security for openc166 0.1.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 12 files in this release have been uploaded with provenance metadata.

Select from 12 files

Attestation for openc166-0.1.16.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page