k˃fo.2dZddlZddlZddlZddlZddlmZddlZGddeZ dZ dZ dZ d Z d Zd Zdd Zdd ZdZedkreZejpejZdZejdkreZejpdZdgZejdkrejpedzZeeeeenLejdkrejpedzZeeeeeen%ejdkrejpedzZeeeeeej ddSdS)a /* * Copyright (C) 2011-2016 Sylvain Munaut * Copyright (C) 2016 sysmocom s.f.m.c. GmbH * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ N)reduceceZdZdgdddfdZedZedZdZdZddZ ddZ d Z d Z dd Z dd ZdZddZdZddZdZdZdS)ConvolutionalCodeNc  ||_d|_||_t||_||_||_||_||_||_ d|D|_ |D]_\} } t|jttjtjt| | d|_`|jdz|_d|_d|j D rat# fd Dst%dt#d|Dst%d d |_dSdS) Nc:g|]}|d|dkrdn|S)rr)rr.0xs )/build/deps/libosmocore/utils/conv_gen.py z.ConvolutionalCode.__init__..-s,===!!A$!A$,,A===c6g|]}|ddk|dSrr r s r rz.ConvolutionalCode.__init__..5s%...AaDAII!IIIrc(g|]}|dkS)rr )r r rps r rz.ConvolutionalCode.__init__..7s!&&&aqBqEz&&&rzCBad polynomials: Can't have multiple different divider polynomials!c>g|]}|ddk|ddkS)rrr r s r rz.ConvolutionalCode.__init__..;s)555Q1Q4199qtqy999rzUBad polynomials: Can't have a '1' divider with a non '1' dividend in a recursive coder) block_lenkpuncturelenrate_inv term_typevec_invec_outname descriptionpolysmaxintmathfloorlog poly_dividerall ValueError) selfrr rrrrrrr yrs @r __init__zConvolutionalCode.__init__sz$. $&$-e**$-$.$+$,$) $>=u===$*AAfq! DJtxAq 1'='=>>?? @ @466 6A:$&$..dj..."  &&&&2&&& ' '; : ; ;; 55%555 6 6   !u4  rc|jdkSNr)r&r)s r recursivezConvolutionalCode.recursiveBs a rc"d|jdz zdz Sr-)rr.s r _state_maskzConvolutionalCode._state_maskFs  q  rcdt|dz|z|j|j}|dz|z|jzSr-)combiner&rr1)r)statebitnbs r next_statezConvolutionalCode.next_stateJsA QJ#6" A: t/ //rc|dz|jzSr-)r1)r)r4s r next_term_statez!ConvolutionalCode.next_term_stateRs 1*( ((rc||||}|dz|dzz}g}|jD]@\}}|jr |dkr|}nt|||j}||A|Sr-)r7r r/r3rappend) r)r4r5nssrcrvp_np_dos r next_outputzConvolutionalCode.next_outputUsZ s##2 aEQJ# "*hc3 n" AAS$&!!A99Q<<<< )rc|||}|dz|dzz}g}|jD]Y\}}|jr"|dkrt||j|j}nt|||j}||Z|Sr-)r9r r/r3r&rr;)r)r4r<r=r>r?r@rAs r next_term_outputz"ConvolutionalCode.next_term_outputhsZ U##2 aEQJ# "*hc3 n"T&//AAS$&!!A99Q<<<< )rcf|||}||||}||fSN)r<)r7rB)r)r4r5r<r6s r nextzConvolutionalCode.next{s8 uc""" s,," R-rcb||}|||}||fSrF)r9rD)r)r4r<r6s r next_termzConvolutionalCode.next_terms6 E""" U,," R-rFcg}t|D]M}|r|||}n||}||Nt |dd|dSNz%3d, )rangerDr9r;print_formatted)r)fi num_statespackitemsr4r s r _print_termzConvolutionalCode._print_terms %Z  e $ T " "5 ) )**AA U##A<<????%"b)))))rcZg}t|D]}|r?|||d}|||d}n,||d}||d}|||ft |dd|dS)Nrrz{ %2d, %2d }, )rMrBr7r;rN)r)rOrPrQrRr4x0x1s r _print_xzConvolutionalCode._print_xs %Z  e # dua(( ) )B dua(( ) )BB  " "B  " "B<<R%)1b11111rc4t|jdd|dSrK)rNr)r)rOs r _print_puncturez!ConvolutionalCode._print_punctures$-"b11111rcB|durN|d|jdz|jddD]}|d|zn7|d|jD]}|d|z|ddS)NTz/*! structure describing %s. rr * %s z/** z */ )writer)r)rObrieflines r print_descriptionz#ConvolutionalCode.print_descriptions d]]88 , q #tHHY 88GtHHY ((7rcfd}djdz z}|djz|||d|djz||||djr|djz|||d|djz||||ddSdS)NcTtfdt|DS)Nc6g|]\}}|j|z dz zSr)r)r ir r)s r rzNConvolutionalCode.print_state_and_output....s.>>>Adma!#$>>>r)sum enumerate)nr)s r z:ConvolutionalCode.print_state_and_output..s.>>>>1>>>??rrz'static const uint8_t %s_state[][2] = { }; z(static const uint8_t %s_output[][2] = { z)static const uint8_t %s_term_state[] = { z*static const uint8_t %s_term_output[] = { )rr]rrXr/rS)r)rOrQrPs` r print_state_and_outputz(ConvolutionalCode.print_state_and_outputsO @ @ @ @$TVaZ *(( 5 ABBB--J((8(( 6 BCCC--J%%%((8 ^88 849 DEEEB ###88H88 9DI EFFFB D)))88Hrc||||j}n|}t|jrG|d|jz|||d|j|||d|d|jd|d|jz|d|j z|d|j z|d |z|d |z|j |d |j z|j r0|d |z|d |zt|jr|d|jz|ddS)Nz#static const int %s_puncture[] = { rizconst struct osmo_conv_code _z = { z .N = %d, z .K = %d, z .len = %d, z .next_output = %s_output, z .next_state = %s_state, z .term = %s, z% .next_term_output = %s_term_output, z# .next_term_state = %s_term_state, z .puncture = %s_puncture, ) rjrrrr]rZrr`rrrrr/)r)prefrO shared_tables table_prefs r gen_tableszConvolutionalCode.gen_tablessr""" :::88 2TY >???88H !"(((diii HIII((>DM )***((>DF "###(( dn ,---(( *Z 7888(( (: 5666 ^88  ./// ^B88 5 BCCC88 3j @AAA888 *TY 6777((8rc|j|jz}|j||j|jdz zz }t |jr|t |jdz z}|Sr-)rrrrrr)r)out_lens r calc_out_lenzConvolutionalCode.calc_out_lensa NT] *' ^ dmtvz**7% c$-  1$$7 .rc2|d|j}|d|d|z|d|z|d|jz|d|z|j|j|d|dt |jd d |d |d |dt |jd d |d |d n?|d|d|d|ddS)Nrlz { z .name = "%s", z .code = &%s, z .in_len = %d, z .out_len = %d, z .has_vec = 1, z .vec_in = { z0x%02x, z )indentz }, z .vec_out = { z .has_vec = 0, z .vec_in = { }, z .vec_out = { }, z }, )rr]rrsrrrN)r)rOprefix code_names r gen_test_vectorz!ConvolutionalCode.gen_test_vectors+)((7(( "Y .///(( ) +,,,(( !DN 2333(( !D$5$5$7$7 7888 [!988 !"""88 !!!4; ArHEEEE88J88 !"""4<QXFFFF88J88 !"""88 #$$$88 #$$$((8rN)F)__name__ __module__ __qualname__r+propertyr/r1r7r9rBrDrGrIrSrXrZr`rjrprsryr rr rrs^"$ D$$$$L    (  !! (!000)))    &    &  * * * *2222 222    ,""""H   rrc4td|DS)Ncg|]}d|zSrr r s r rz..s111q16111r)re)argss r rhrhsS11D11122rcf||zd}t|fdt|DS)Nc ||z Srzr )r r*s r rhzcombine..s q1urc g|] }|z dz Srr )r rgr s r rzcombine..s!888a1 888r)rrM)r=selr6fn_xorr s @r r3r3s?3Y  v8888eBii888999rcd}|d|D]C}|dkr||zdkr|d|||z|dz }D|ddS)Nr z r )r])rRformatcountrOcounteritems r rNrNs $ T q[[Wu_))88F((6D= Q,''$rc|D],\}}td||}||-dS)Nr)r)rRrrj)rO shared_polysrr codes r print_sharedr*sV"((**""]dE 1eD 1 1 1$b!!!!""rctj||}tj|stj|t |dS)Nw)ospathjoinisdirmakedirsopen) parent_dir base_namers r open_for_writingr0sK  Z++  j!!+j T3rcNt||}|tdz|d|dtjdt |drt ||j|jD]}tjd|j zd}t |dr.|j D]\}}|j |kr|}n| |||dS)Nr#include #include z"Generating convolutional codes... rzGenerate '%s' definition )rn) rr] mod_licensesysstderrhasattrrr conv_codesrrRr rp)codesrrwrfrsharedr s r generate_codesr6s<dD!!t  !!! -...7888 E>""&q%$%%%  5 5T*/$);<<< & UN## *0022  }e zUV U//&!V/4444 5 5rcxt||}|tdz||D]}|d|z|d|dtjdt |j}|d||fz|d||fz|jD]?}tjd|jz|||@|d dS) Nrz%s z#include z#include "conv.h" zGenerating test vectors... z const int %s_vectors_len = %d; z1const struct conv_test_vector %s_vectors[%d] = { zGenerate '%s' test vector z}; ) rr]rrrrrrry) rrrwrincrr vec_countrs r generate_vectorsrQsPdD!!t Od776D= +,,, "###0111 ! " " - Y  = Y  ""T*049<===q&!!!!rczt||}|tdz|d|d|d|E|d|z|d|z|dtjd|jD]`}tjd |jz||d |d |d |jd adS)Nrz#pragma once rrz/*! \file %s.h r\z */ zGenerating header file... zGenerate '%s' declaration Tz#extern const struct osmo_conv_code rlz; )rr]rrrrrr`)rrrwrrrrs r generate_headerrmsFdD!!t   !!! -...''  &''''')k !"""'')/000 T*049<===D!!!''' ffdiii rcFtj}|ddgd|dddg|dd d |d d d |ddd |S)Nactionzwhat to generate) gen_codes gen_vectors gen_header)helpchoicesfamilyzconvolutional code familygsmz-pz--prefixzinternal naming prefix)rz-nz --target-nameztarget name for generated filez-Pz --target-pathztarget path for generated file)argparseArgumentParser add_argument parse_args)parsers r parse_argvrs  ! # #X  6 6 6888X $ G T: !###T? )+++T? )+++ r__main__rgsm0503z #include rz_conv.crz_test_vectors.crz.hzGeneration complete. rz)!rrrr#r functoolsrconv_codes_gsmobjectrpolyr3rNrrrrrrr{argv target_pathgetcwdrrrrrwr target_namerrr]r rr rsD &xxxxxxxxt32:::   """  555682* z  'IBIKK  K5 % ; #)& ,.# K;  /Vi/$.fd++++ k]""  7V&77$5$c2222 k\!!  *Vd]$/%vt,,,*+++++/r