diff options
author | Uwe Hermann <uwe@hermann-uwe.de> | 2016-08-26 15:09:17 +0200 |
---|---|---|
committer | Uwe Hermann <uwe@hermann-uwe.de> | 2016-12-07 22:37:49 +0100 |
commit | 21dfd91d99836bdc6c0da939b601dd8a52358f21 (patch) | |
tree | 54e380dc67e1cd73273679d04c4c5a8af3036e4f /libsigrokdecode-internal.h | |
parent | ee9304c667bf98b3c4e3a767943e3d8f6964601e (diff) | |
download | libsigrokdecode-21dfd91d99836bdc6c0da939b601dd8a52358f21.tar.gz libsigrokdecode-21dfd91d99836bdc6c0da939b601dd8a52358f21.zip |
Add support for the new query-based PD v3 decoder API.
For the time being, both APIs (2 and 3) will remain supported until all
decoders have been converted to API version 3. Then, support for API
version 2 will be dropped.
Decoders using PD v3 API can benefit from both readability improvements
as well as performance improvements. Up to 10x speedup has been measured
in some situations (depends a lot on the decoder, the amount of data,
the amount of edges in the signals, the amount of oversampling etc. etc.).
This is only the first set of (basic) performance improvements for
libsigrokdecode, there are various additional opportunities for further
changes to improve performance.
This changeset has been tested to survive a run of all the test-cases in
the sigrok-test repo without issues (for the converted PDs), however it is
not very well-tested yet, so there might be regressions that need to be
addressed.
Diffstat (limited to 'libsigrokdecode-internal.h')
-rw-r--r-- | libsigrokdecode-internal.h | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/libsigrokdecode-internal.h b/libsigrokdecode-internal.h index 8259b97..c006574 100644 --- a/libsigrokdecode-internal.h +++ b/libsigrokdecode-internal.h @@ -28,6 +28,23 @@ #include <Python.h> /* First, so we avoid a _POSIX_C_SOURCE warning. */ #include "libsigrokdecode.h" +enum { + SRD_TERM_HIGH, + SRD_TERM_LOW, + SRD_TERM_RISING_EDGE, + SRD_TERM_FALLING_EDGE, + SRD_TERM_EITHER_EDGE, + SRD_TERM_NO_EDGE, + SRD_TERM_SKIP, +}; + +struct srd_term { + int type; + int channel; + uint64_t num_samples_to_skip; + uint64_t num_samples_already_skipped; +}; + /* Custom Python types: */ typedef struct { @@ -62,9 +79,12 @@ SRD_PRIV struct srd_pd_callback *srd_pd_output_callback_find(struct srd_session SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj( const GSList *stack, const PyObject *obj); SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di); -SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di, +SRD_PRIV void match_array_free(struct srd_decoder_inst *di); +SRD_PRIV void condition_list_free(struct srd_decoder_inst *di); +SRD_PRIV int srd_inst_decode(struct srd_decoder_inst *di, uint64_t start_samplenum, uint64_t end_samplenum, const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize); +SRD_PRIV int process_samples_until_condition_match(struct srd_decoder_inst *di, gboolean *found_match); SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di); SRD_PRIV void srd_inst_free_all(struct srd_session *sess, GSList *stack); @@ -102,6 +122,8 @@ PyMODINIT_FUNC PyInit_sigrokdecode(void); SRD_PRIV PyObject *py_import_by_name(const char *name); SRD_PRIV int py_attr_as_str(PyObject *py_obj, const char *attr, char **outstr); SRD_PRIV int py_dictitem_as_str(PyObject *py_obj, const char *key, char **outstr); +SRD_PRIV int py_pydictitem_as_str(PyObject *py_obj, PyObject *py_key, char **outstr); +SRD_PRIV int py_pydictitem_as_long(PyObject *py_obj, PyObject *py_key, uint64_t *out); SRD_PRIV int py_str_as_str(PyObject *py_str, char **outstr); SRD_PRIV int py_strseq_to_char(PyObject *py_strseq, char ***out_strv); SRD_PRIV GVariant *py_obj_to_variant(PyObject *py_obj); |