Python Bindings#

These bindings exist to provide Python interfaces to the FPGA on AWS F2 EC2 Instances, allowing developers to control and interact with FPGAs using Python instead of C code directly.

Cython Overview#

A typical Cython binding setup creates a bridge between Python and C code through a specific file structure: the .pxd file declares the external C functions and types (similar to a C header file), while the .pyx file implements the actual Python-facing wrappers around these C functions, handling type conversions and memory management.

When compiled, Cython transforms the .pyx file into C code, which is then built into a shared object (.so) file that Python can import directly as a module, allowing Python code to seamlessly call C functions while maintaining Python’s ease of use but with C’s performance benefits.

Setup#

How to Build Bindings#

git clone https://github.com/aws/aws-fpga.git
cd aws-fpga
source sdk_setup.sh

This process will generate the necessary *_wrapper.c files that enable Python-to-C communication.

Instructions to run examples#

Navigate to the aws-fpga/sdk/userspace/cython_bindings directory

sudo python3 fpga_mgmt_example.py
sudo python3 fpga_clkgen_example.py
sudo python3 fpga_pci_example.py

Troubleshooting#

  • FPGA Unresponsive: Run Python scripts with sudo privileges

  • Library not found: Verify AWS FPGA SDK installation is complete and sourced

  • Invalid slot ID: Verify slot number is valid for instance type

  • AFI load timeout: Check AFI ID and instance permissions, and ensure sufficient time after async FPGA clears and loads

  • Debug: Enable verbose logging by setting logging.INFO in utils.py

  • Supported Python Versions: Bindings can be used by all Python versions supported by Cython

  • How do I find my instance type during runtime: Instance Meta Data Documentation

FPGA Management Library Functions#

These are the core functions that provide direct interaction with AWS F2 FPGA instances. The primary functions include FPGA slot initialization, image loading/clearing, status checking, and metric gathering. These functions form the API layer between Python applications and the low-level FPGA hardware management, allowing developers to control FPGA resources without dealing directly with the hardware registers or low-level C interfaces.

  • load_local_image(self, slot_id: int, afi_id: str) -> dict

  • clear_local_image(self, slot_id: int) -> dict

  • describe_local_image(self, slot_id: int, flags: uint32_t) -> dict

  • strerror(error: int) -> str

  • strerror_long(err: int) -> str

  • get_status_name(status: int) -> str

  • get_status(self, slot_id: int) -> dict

  • set_cmd_timeout(self, value: uint32_t) -> None

  • set_cmd_delay_msec(self, value: uint32_t) -> None

  • get_vLED_status(self, slot_id: int) -> uint16_t

  • set_vDIP(self, slot_id: int, value: uint16_t) -> None

  • get_vDIP_status(self, slot_id: int) -> uint16_t

  • clear_local_image_sync(self, slot_id: int, timeout: uint32_t, delay_msec: uint32_t) -> dict

  • load_local_image_flags(self, slot_id: int, afi_id: str, flags: uint32_t) -> dict

  • load_local_image_sync_flags(self, slot_id: int, afi_id: str, flags: uint32_t, timeout: uint32_t, delay_msec: uint32_t) -> dict

FPGA Clock Generation Library Functions#

The Clock Generation Library provide essential clock management capabilities for AWS FPGA instances, allowing precise control over clock frequencies and configurations. The primary functions include retrieving current clock settings, applying predefined clock recipes, and dynamically adjusting frequencies across multiple clock domains (A, B, C, and HBM). These functions form the API layer between Python applications and the low-level clock management system, allowing developers to precisely control FPGA clock resources without directly manipulating hardware registers. More information on clock generation functions are available in the Clock Recipes User Guide document.

  • get_dynamic(self, slot_id: int) -> str

  • set_recipe(self, slot_id: int, clk_a_recipe: uint32_t, clk_b_recipe: uint32_t, clk_c_recipe: uint32_t, clk_hbm_recipe: uint32_t, reset: uint32_t) -> None

  • set_dynamic(self, slot_id: int, clk_a_freq: uint32_t, clk_b_freq: uint32_t, clk_c_freq: uint32_t, clk_hbm_freq: uint32_t, reset: uint32_t) -> None

FPGA PCI Library Functions#

The FPGA PCI library provides a comprehensive set of functions for managing and interacting with the PCI bus on AWS FPGA instances. The library starts with initialization to set up the PCI management interface, and pci_attach()/pci_detach() to establish and terminate connections to specific PCI Base Address Registers (BARs). These functions form the basis for accessing PCI-mapped hardware resources.

  • pci_attach(self, slot_id: int, pf_id: int, bar_id: int, flags: uint32_t) -> pci_bar_handle_t

  • pci_detach(self, handle: pci_bar_handle_t) -> None

  • pci_poke(self, handle: pci_bar_handle_t, offset: uint64_t, value: uint32_t) -> None

  • pci_poke8(self, handle: pci_bar_handle_t, offset: uint64_t, value: uint8_t) -> None

  • pci_poke64(self, handle: pci_bar_handle_t, offset: uint64_t, value: uint64_t) -> None

  • pci_write_burst(self, handle: pci_bar_handle_t, offset: uint64_t, data: List[int], dword_len: uint64_t) -> None

  • pci_peek(self, handle: pci_bar_handle_t, offset: uint64_t) -> uint32_t

  • pci_peek8(self, handle: pci_bar_handle_t, offset: uint64_t) -> uint8_t

  • pci_peek64(self, handle: pci_bar_handle_t, offset: uint64_t) -> uint64_t

  • pci_get_slot_spec(self, slot_id: int) -> fpga_slot_spec

  • pci_get_all_slot_specs(self, size: int) -> List[fpga_slot_spec]

  • pci_get_resource_map(self, slot_id: int, pf_id: int) -> fpga_pci_resource_map

  • pci_rescan_slot_app_pfs(self, slot_id: int) -> None

  • pci_get_address(self, handle: pci_bar_handle_t, offset: uint64_t, dword_len: uint64_t) -> uintptr_t

  • pci_memset(self, handle: pci_bar_handle_t, offset: uint64_t, value: uint32_t, dword_len: uint64_t) -> None