<?xml version="1.0"?>
<!--
###################################################
## PCCC Decoder Combined
###################################################
 -->


<block>
  <name>PCCC Decoder Combo</name>
  <key>trellis_pccc_decoder_combined_xx</key>
  <category>[Core]/Trellis Coding</category>
  <import>from gnuradio import trellis, digital</import>
  <make>trellis.pccc_decoder_combined_$(type)$(out_type)(
    trellis.fsm($o_fsm_args), $o_init_state, $o_final_state,
    trellis.fsm($i_fsm_args), $i_init_state, $i_final_state,
    trellis.interleaver($interleaver),
    $block_size,
    $iterations,
    $siso_type,
    $dim, $table, $metric_type,
    $scaling)
  </make>
        <callback>set_scaling($scaling)</callback>
  <param>
    <name>Input Type</name>
    <key>type</key>
    <type>enum</type>
    <option>
      <name>Complex</name>
      <key>c</key>
      <opt>io:complex</opt>
      <opt>table:complex_vector</opt>
    </option>
    <option>
      <name>Float</name>
      <key>f</key>
      <opt>io:float</opt>
      <opt>table:real_vector</opt>
    </option>
  </param>
  <param>
    <name>Output Type</name>
    <key>out_type</key>
    <type>enum</type>
    <option>
      <name>Int</name>
      <key>i</key>
      <opt>io:int</opt>
    </option>
    <option>
      <name>Short</name>
      <key>s</key>
      <opt>io:short</opt>
    </option>
    <option>
      <name>Byte</name>
      <key>b</key>
      <opt>io:byte</opt>
    </option>
  </param>
  <param>
    <name>FSM 1</name>
    <key>o_fsm_args</key>
    <type>raw</type>
  </param>
  <param>
    <name>Initial State 1</name>
    <key>o_init_state</key>
    <value>0</value>
    <type>int</type>
  </param>
  <param>
    <name>Final State 1</name>
    <key>o_final_state</key>
    <value>-1</value>
    <type>int</type>
  </param>
  <param>
    <name>FSM 2</name>
    <key>i_fsm_args</key>
    <type>raw</type>
  </param>
  <param>
    <name>Initial State 2</name>
    <key>i_init_state</key>
    <value>0</value>
    <type>int</type>
  </param>
  <param>
    <name>Final State 2</name>
    <key>i_final_state</key>
    <value>-1</value>
    <type>int</type>
  </param>
  <param>
    <name>Interleaver</name>
    <key>interleaver</key>
    <type>raw</type>
  </param>
  <param>
    <name>Block Size</name>
    <key>block_size</key>
    <type>int</type>
  </param>
  <param>
    <name>Iterations</name>
    <key>iterations</key>
    <value>10</value>
    <type>int</type>
  </param>
  <param>
    <name>Dimensionality</name>
    <key>dim</key>
    <type>int</type>
  </param>
  <param>
    <name>Constellation</name>
    <key>table</key>
    <type>$type.table</type>
  </param>
  <param>
    <name>Metric Type</name>
    <key>metric_type</key>
    <type>enum</type>
    <option>
      <name>Euclidean</name>
      <key>digital.TRELLIS_EUCLIDEAN</key>
    </option>
    <option>
      <name>Hard Symbol</name>
      <key>digital.TRELLIS_HARD_SYMBOL</key>
    </option>
    <option>
      <name>Hard Bit</name>
      <key>digital.TRELLIS_HARD_BIT</key>
    </option>
  </param>
  <param>
    <name>SISO Type</name>
    <key>siso_type</key>
    <type>enum</type>
    <option>
      <name>Min Sum</name>
      <key>trellis.TRELLIS_MIN_SUM</key>
    </option>
    <option>
      <name>Sum Product</name>
      <key>trellis.TRELLIS_SUM_PRODUCT</key>
    </option>
  </param>
  <param>
    <name>Scaling</name>
    <key>scaling</key>
    <value>1.0</value>
    <type>real</type>
  </param>
  <check>(isinstance(eval(""" $o_fsm_args """[1:-1], locals(),globals()), str) and open($o_fsm_args).close()) or True</check>
  <check>(isinstance(eval(""" $i_fsm_args """[1:-1], locals(),globals()), str) and open($i_fsm_args).close()) or True </check>
  <sink>
    <name>in</name>
    <type>$type.io</type>
  </sink>
  <source>
    <name>out</name>
    <type>$out_type.io</type>
  </source>
  <doc>
PCCC turbo Decoder combined with metric calculation.
The fsm arguments are passed directly to the trellis.fsm() constructor.
  </doc>
</block>
