aboutsummaryrefslogtreecommitdiffstats
path: root/host/python
Commit message (Collapse)AuthorAgeFilesLines
* python: Add mpmtools moduleMartin Braun2020-12-041-0/+173
| | | | | This adds tools to create MPM clients and talk to MPM through Python scripts.
* python: Clean up image builder generated codeWade Fife2020-11-069-117/+142
| | | | | This updates the RFNoC image to generate code that's a bit more tidy, with consistent spacing and better alignment.
* python: Add access to the property_tree from PythonMartin Braun2020-10-164-0/+20
| | | | | | | Example: >>> usrp = uhd.usrp.multi_usrp("") >>> tree = usrp.get_tree() >>> print(tree.access_int("/name").get())
* python: Move multi_usrp_python to its own moduleMartin Braun2020-10-121-1/+4
| | | | | This helps with recompilation times of UHD. No functional changes.
* sim: Embed MPM into libpyuhdSamuel O'Brien2020-10-071-0/+57
| | | | | | | When ENABLE_SIM and ENABLE_PYTHON_API are set, this commit embeds MPM (Built with -DMPM_DEVICE=sim) into the pyuhd package. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* cmake: Use relative path to Python lib location for Windows installerAaron Rossetto2020-08-281-5/+17
|
* python: power cal: Minor fixes to power cal codeMartin Braun2020-08-171-4/+8
| | | | | | | | - Fix some typos - Fix incorrect arg name for RFSGPowerGenerator.enable() - Fix case where incorrect args would cause an uncaught TypeError. Now, if USRP is chose as signal generator, but fails to find one, a proper error is shown.
* python: Change default name for rfnoc_image_coreWade Fife2020-08-101-5/+11
| | | | | | | | This changes the default name of the image core file to <DEVICE>_rfnoc_image_core.v instead of naming it after the YAML file. This ensures that when you use a custom YAML file, the resulting FPGA build will use the generated rfnoc_image_core and static_router files, rather than just the generated static_router file.
* python: Add Keep One in N block controller bindingsAaron Rossetto2020-08-052-0/+3
|
* python: Add replay RFNoC block controller bindingsmattprost2020-08-042-0/+3
| | | | Signed-off-by: mattprost <matt.prost@ni.com>
* python: Fix pyuhd to include subpackagesSamuel O'Brien2020-08-041-2/+6
| | | | | | | | | | | | | | | | | Originally, the setup.py file for pyuhd listed only one package packages=['uhd'] the setuptools docs: https://setuptools.readthedocs.io/en/latest/setuptools.html#using-find-packages specify that this should also include subpackages, i.e uhd.dsp, uhd.usrp, etc. Currently, when packaging libpyuhd, we are not including the subpackages, and then when you run `import uhd`, it fails because uhd.usrp and uhd.dsp don't exist. This commit alleviates this issue by using setuptools.find_packages like the docs recommend. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* utils: Use absolute paths in image builder build()steviez2020-07-311-2/+2
| | | | | | | A segment of the build() function updates the working directory. This change converts several paths to absolute paths to avoid having a relative path (such as one containing up-level references) deviate from its' intended meaning after the directory change.
* python: Add siggen RFNoC block controller bindingsAaron Rossetto2020-07-302-0/+3
|
* python: Add Switchboard block python bindingsJesse Zhang2020-07-302-0/+3
|
* python: Add moving average RFNoC block controller bindingsmattprost2020-07-162-0/+3
| | | | Signed-off-by: mattprost <matt.prost@ni.com>
* python: Add payload agnostic methods to CHDR APISamuel O'Brien2020-07-162-0/+61
| | | | | | | | | | | | | | | | | | | | | | | | In the c++ api, methods like chdr_packet#set_payload() and chdr_packet#get_payload() are templated over the payload type (payload_t). For methods like set_payload, they are overloaded by the type of an argument, so in pybind we can just explicitly instaniate the template for each payload_t and register it with pybind under the same name. At runtime, pybind looks at the type of the argument and decides which to call. The problem arose with methods like get_payload, which are overloaded by return type. In C++, the compiler can infer the template type by the type of the target at the call site. In python, there is no way for the pybind to determine which variant of get_payload to call, and it would crash. Previously, the workaround for this was to declare get_payload_ctrl, get_payload_mgmt, etc, but this was rather anti-pythonic. This commit utilizes the fact that python methods don't have a constrained return type to resolve this. Now, get_payload will call a python method which looks at the chdr_packet#header#pkt_type field to determine which variant of get_payload to call and returns that type of payload_t. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* python: Add bindings for C++ CHDR ParserSamuel O'Brien2020-07-161-0/+4
| | | | | | | | | | | | | This commit adds pybind11 glue code for the userland chdr parsing code introduced in the uhd::utils::chdr namespace. Additionally, it moves some pybind11 adapter code to a common pybind_adaptors.hpp file which originally existed in the cal_python.hpp file. This commit also adds unit tests for the python bindings using a captured wireshark trace which is located in rfnoc_packets_*.py and some handwritten packets in hardcoded_packets.py Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* python: Add window RFNoC block controller bindingsAaron Rossetto2020-06-292-1/+3
|
* utils: Support expressions for num_ports in block defsAaron Rossetto2020-06-181-2/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit allows the RFNoC image builder utility to support block definition .yml files where the num_ports values are numerical expressions using values sourced from the parameters section when the block is used in an RFNoC image. An example of such an expression for num_ports is the split stream block, where the number of output ports is defined as the product of the NUM_PORTS and NUM_BRANCHES parameters: data: fpga_iface: axis_chdr clk_domain: rfnoc_chdr inputs: in: num_ports: NUM_PORTS outputs: out: num_ports: NUM_PORTS*NUM_BRANCHES In an RFNoC image definition .yml file, these parameters can be specified when a split stream block is instantiated in an image: split0: block_desc: 'split_stream.yml' parameters: NUM_PORTS: 2 NUM_BRANCHES: 3 Thus, the split0 instance of the split stream block is configured with 2 input ports and 6 output ports (2*3 from NUM_PORTS*NUM_BRANCHES). When the RFNoC image builder runs and encounters a block instantiation where that block has a non-integer string in the num_ports key of its block definition, it performs a textual replacement of the identifiers in the string with the corresponding values from the parameters section of the block's instantiation. If no such parameter corresponding to the identifier exists, the block definition file's parameters section is consulted for a default value for the parameter. If no such parameter can be found in either of these locations, the identifier is left unchanged in place. After the text substitution step, the expression is evaluated using Python's expression evaluator. The expression should evaluate to an integer value, which is then used as the num_ports value. If the expression does not evaluate to an integer, or fails to evaluate, an error will be reported.
* python: Add FFT RFNoC block controller bindingsAaron Rossetto2020-06-182-0/+3
|
* cal: Add automated port switchLars Amsel2020-06-173-19/+141
| | | | | | | | | | | | | | | | | Current implementation needed manual interaction to calibrate each antenna. More sophisticated setups are able to switch between channels and antennas programmatically. This commit introduces a base class that handle the switch behaviour. The previous implementation moved to a ManualSwitch class which is the default switch. Without any options the previous flow remains unchanged. A new class is able to handle NI switch models. The switch port can be given via options parameter (comA is default). The channels are connected in ascending order. The user has to ensure that the cable setup matches the order given for channels and antennas. Co-authored-by: Martin Braun <martin.braun@ettus.com>
* cal: Add support for NI ModInst measurement devicesLars Amsel2020-06-102-0/+455
| | | | | | | | | | | | | | | | | | | | | | Power measurements for TX calibration can be done using NI-RFSA devices and the RFmx SpecAn library. Use "rfsa" as meas_device option for this. The implementation mimics the behaviour of the "RFMXSpecAn TXP (Basic)" example. Signal generation for RX calibration can be done using NI-RFSG devices. Use "rfsg" as meas_device option for this. The implementation mimics the behaviour of the "RFSG Frequency Sweep" example. The device can be selected by passing its name in the option string. This is only necessary if more than one device of the same family is installed in the system. The support is limited to Windows operating System. Drivers for RFSA and RFSG must be installed as well as the RFmx SpecAn library. The "nimodinst" Python package must be installed to be able to detect the devices. The implementation uses ctypes to call into the C-API of the device drivers. Only the bare minimum to fulfill the calibration requirements is implemented.
* python: Add null RFNoC block controller bindingsAaron Rossetto2020-06-092-0/+3
|
* python: Add vector IIR RFNoC block controller bindingsAaron Rossetto2020-06-092-0/+3
|
* python: Add radio RFNoC block controller bindingsAaron Rossetto2020-06-092-0/+3
|
* python: Add FIR filter RFNoC block controller bindingsAaron Rossetto2020-06-092-0/+3
|
* python: Add Fosphor RFNoC block controller bindingsAaron Rossetto2020-06-092-0/+3
|
* python: Add DUC RFNoC block controller bindingsAaron Rossetto2020-06-092-0/+3
|
* python: Add DDC RFNoC block controller bindingsAaron Rossetto2020-06-092-0/+4
|
* python: cal: Improve meas_device.pyMartin Braun2020-06-031-6/+6
| | | | | | | | | | - Remove some PyLint issues by aligning the argument list for SignalGeneratorBase.enable() - Improve an assertion: Since a valid power level is 0 dBm, we need to explicitly check max power against None, not 0 - Improve the error message for when no device is found ("signal generator" instead of "RX measurement device", since the latter is confusing/ambiguous)
* utils/python: Add uhd_power_cal scriptMartin Braun2020-05-286-0/+955
| | | | This is a tool for running power calibration.
* python: Add dsp sub-moduleMartin Braun2020-05-192-0/+84
| | | | | | | | | | | This lets you do >>> from uhd import dsp >>> s = dsp.signals.get_continuous_tone(...) >>> pwr = dsp.signals.get_power_dbfs(s) ...and so on. This module is for UHD-based utilities to have some additional signal processing functions to tap into.
* rfnoc: Remove 'six' dependency from image builderMartin Braun2020-05-124-22/+22
| | | | Also fixes a few minor PyLint complaints.
* Remove remaining Python 2 referencesMartin Braun2020-05-072-4/+3
| | | | | | | This changes two things in all applicable files: - Remove imports from __future__ - Change default shebangs from /usr/bin/env python to /usr/bin/env python3
* python: Fix RPATH for the Python libraryMartin Braun2020-05-071-2/+23
| | | | | | | | | | | | | | | | On UNIX systems, CMake will set the RPATH of the Python library to the build directory, which is very helpful because it allows unit and other tests to be executed from within the build directory. On installation, the RPATH is removed, but only if install(TARGETS) is used, which we were not, thus resulting in incorrect RPATHs. This would surface as a bug, too. Calling uhd.get_lib_path() would always point to the build directory, thus resulting in no FPGA images being found automatically, e.g. when running a B200 through the Python API. This change installs the Python .so file separately, using the correct CMake mechanisms.
* python: Move the rfnoc image builder module under the uhd moduleMartin Braun2020-05-0515-0/+1460
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Note: This commit changes nothing to the way the image builder is being called. One can still run rfnoc_image_builder [...] as before. The difference is in the Python guts: Where previously one had to do import rfnoc now the incantation becomes: from uhd import imgbuilder (Note that the submodule uhd.rfnoc already exists for wrapping the RFNoC API into Python, hence the renaming from rfnoc to imgbuilder). This is done for a variety of reasons: - Now, there is only one and exactly one Python module for UHD that contains all the things, as opposed to before where there were two. - The rfnoc and uhd modules were installed in different ways (setuptools vs. CMake); that is now harmonized. This also removes a lot of CMake plumbing. - It is not common to import the rfnoc module for anyone other than rfnoc_image_builder
* cal: Add pwr_cal containerMartin Braun2020-04-171-0/+1
| | | | | | | This is a cal container for all types of power cal (RX or TX) that rely on a single, overall gain value. Includes Python API.
* uhd: cal: Add iq_cal calibration data container classMartin Braun2020-04-024-0/+25
| | | | | | | | This class can be used to store calibration coefficients for the X300 DC offset and IQ imbalance calibration. Note: This also modifies Doxyfile.in to not document files generated by flatc.
* uhd: cal: Add database classMartin Braun2020-03-261-0/+19
| | | | | | This class contains methods to store and retrieve data from the local calibration database. Note that in this case, the "database" is just a bunch of files on the local filesystem.
* python: Export UHD paths utility functionsMartin Braun2020-03-122-0/+6
| | | | | | | | | All of the functions defined in uhd/utils/paths.hpp are now available in Python, with the exception of get_module_paths(). #!/usr/bin/env python3 import uhd print(uhd.get_lib_path()) # Prints location of libuhd
* python: Remove Python2-specific codeMartin Braun2020-03-121-7/+0
|
* python: Arrange file in Python module into uhd/ subdirectoryMartin Braun2020-03-108-21/+54
| | | | | | | | | | | | | | | This adds the host/python/uhd subdirectory, which will add all files that go into the actual Python module once installed. Before, all Python files were directly in host/python and got sorted into their appropriate destination folders during configuration and installation. This change doesn't change anything (Python modules will look the same as they do now), except that it makes the source tree a tad neater, but more importantly, it creates a consistent directory structure when adding submodules to the uhd module. Apart from the PyBind11-generated shared object file (which gets generated during build time), the uhd/ subdirectory in host/python exactly resembles the Python module once installed, so it's more obvious where to add new submodules and files.
* uhd: Apply clang-format against all .cpp and .hpp files in host/Martin Braun2020-03-031-11/+7
| | | | | Note: template_lvbitx.{cpp,hpp} need to be excluded from the list of files that clang-format gets applied against.
* python: Set python module suffix to conform with PEP 3149.Ryan Volz2020-02-071-1/+10
| | | | | | | | | This adds the python implementation, major and minor version numbers, and any additional flags (debug, pymalloc, wide unicode) to the extension module suffix as specified in PEP 3149. Hat tip to @isuruf: https://github.com/conda-forge/staged-recipes/pull/10076#discussion_r348721448
* python: Do not link against python lib for building an extension module.Ryan Volz2020-02-071-1/+10
| | | | | | | | | | | | This fixes a segmentation fault when trying to use the python module on OSX when built with conda (unsure why it doesn't arise otherwise). Instead of linking against the python library, it is proper to not link against the library and, for OSX builds, add linker options for "-undefined" and "dynamic_lookup". This is precisely what the CMake FindPython module does for linking against the Python::Module target. See https://blog.tim-smith.us/2015/09/python-extension-modules-os-x and https://bugs.python.org/issue36721
* python: Fix internal library name (incl. suffix) to match filename.Ryan Volz2020-02-071-7/+7
| | | | | | Instead of renaming the library file, this sets the suffix in CMake so that the filename turns out as desired and also linker references know the correct name.
* python: rfnoc: finishing noc_block_base::get_mtuBrent Stapleton2020-01-061-0/+2
| | | | | | | Adding bindings for res_source_info, which allows us to use noc_block_base::get_mtu. Fixes: 400b00c34338 ("rfnoc: adding RFNoC Python API")
* rfnoc: adding RFNoC Python APIBrent Stapleton2020-01-024-0/+26
| | | | | | | | Adding Python bindings for the RFNoC API. This includes the rfnoc_graph, noc_block_base, and several other supporting classes. Templated functions are not currently supported. For example, `rfnoc_graph::get_block` can only return the basic block controller.
* uhd: Replace usage of boost smart pointers with C++11 counterpartsMartin Braun2019-11-261-5/+0
| | | | | | | | | | | | | | | | | | | This removes the following Boost constructs: - boost::shared_ptr, boost::weak_ptr - boost::enable_shared_from_this - boost::static_pointer_cast, boost::dynamic_pointer_cast The appropriate includes were also removed. All C++11 versions of these require #include <memory>. Note that the stdlib and Boost versions have the exact same syntax, they only differ in the namespace (boost vs. std). The modifications were all done using sed, with the exception of boost::scoped_ptr, which was replaced by std::unique_ptr. References to boost::smart_ptr were also removed. boost::intrusive_ptr is not removed in this commit, since it does not have a 1:1 mapping to a C++11 construct.
* python: MultiUSRP: Fix send_waveforms()iprivit2019-11-131-1/+1
| | | | | | | | | | | | | The send_waveform() function takes the waveform_proto array and if it has only 1 channel, explicitly reshapes it to be (1, waveform_proto.size), or uses np.tile to replicate the waveform_proto array over X channels. It then proceeds to loop over the waveform_proto array, but attempts to do so over the channel dimension instead of looping over the actual samples. This results in sending the entire waveform_proto array regardless of the duration specified. The fix is to specify the dimension in which it crops, and not crop in dimension of the channels.