fo.@sdZddlZddlZddlZddlZddlmZddlZGdddeZ ddZ dd Z d d Z d d Z ddZddZdddZdddZddZedkreZejpejZdZejdkr7eZejp+dZdgZejdkroejpVedZeeeeenpejdkrejpedZeeeeeen5ejd krejped!Zeeeeeejj d"dS)#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)reducec@s eZdZdgdddddZeddZeddZdd Zd d Zdd d Z dddZ ddZ ddZ dddZ dddZddZdddZddZddd Zd!d"Zd#d$ZdS)%ConvolutionalCodeNc sS||_d|_||_t||_||_||_||_||_||_ dd|D|_ xM|D]E\} } t |jt t jt jt | | d|_qtW|jd|_d|_dd|j DrOtfddDstdtdd|DsBtd d |_dS) NcSs0g|]&}|d|dkr&dn|qS)rr)rr).0xrrh/home/osmocom-build/jenkins/workspace/osmo-gsm-tester_build-osmo-bts-sysmo/libosmocore/utils/conv_gen.py -s z.ConvolutionalCode.__init__..cSs*g|] }|ddkr|dqS)rr)rrrrrr 5s cs g|]}|dkqS)rr)rr)rprrr 7s zCBad polynomials: Can't have multiple different divider polynomials!cSs0g|]&}|ddkr|ddkqS)rrr)rrrrrr ;s zUBad 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) selfr rrrrrrrryr)r r__init__s*        =   zConvolutionalCode.__init__cCs |jdkS)Nr)r)rrrr recursiveBszConvolutionalCode.recursivecCsd|jd>dS)Nr)r )rrrr _state_maskFszConvolutionalCode._state_maskcCs3t|d>|B|j|j}|d>|B|j@S)Nr)combinerr r#)rstatebitnbrrr next_stateJs   zConvolutionalCode.next_statecCs|d>|j@S)Nr)r#)rr%rrrnext_term_stateRsz!ConvolutionalCode.next_term_statec Cs|dkr|j||}|d@|d>B}g}xW|jD]L\}}|jrj|dkrj|}nt|||j}|j|q@W|S)Nr)r(rr"r$r append) rr%r&nssrcrvp_np_dorrr next_outputUs  zConvolutionalCode.next_outputcCs|dkr|j|}|d@|d>B}g}xi|jD]^\}}|jry|dkryt||j|j}nt|||j}|j|q=W|S)Nr)r)rr"r$rr r*)rr%r+r,r-r.r/r0rrrnext_term_outpuths z"ConvolutionalCode.next_term_outputcCs4|j||}|j||d|}||fS)Nr+)r(r1)rr%r&r+r'rrrnext{szConvolutionalCode.nextcCs.|j|}|j|d|}||fS)Nr+)r)r2)rr%r+r'rrr next_termszConvolutionalCode.next_termFcCsng}xNt|D]@}|r7||j|}n|j|}|j|qWt|dd|dS)Nz%3d, )ranger2r)r*print_formatted)rfi num_statespackitemsr%rrrr _print_termszConvolutionalCode._print_termcCsg}xt|D]v}|rR||j|d}||j|d}n$|j|d}|j|d}|j||fqWt|dd|dS)Nrrz{ %2d, %2d }, )r6r1r(r*r7)rr8r9r:r;r%x0x1rrr_print_xszConvolutionalCode._print_xcCst|jdd|dS)Nz%3d, r5)r7r)rr8rrr_print_puncturesz!ConvolutionalCode._print_puncturecCs|dkrV|jd|jdxa|jddD]}|jd|q8Wn2|jdx"|jD]}|jd|qmW|jddS)NTz/*! structure describing %s. rrz * %s z/** z */ )writer)rr8brieflinerrrprint_descriptions   z#ConvolutionalCode.print_descriptioncsfdd}djd>}|jdjj|||jd|jdjj||||jdjr|jdjj|||jd|jdjj||||jddS) Ncs#tfddt|DS)Ncs+g|]!\}}|j|d>qS)r)r)rir)rrrr s zNConvolutionalCode.print_state_and_output....)sum enumerate)n)rrrsz:ConvolutionalCode.print_state_and_output..rz'static const uint8_t %s_state[][2] = { z}; z(static const uint8_t %s_output[][2] = { z)static const uint8_t %s_term_state[] = { z*static const uint8_t %s_term_output[] = { )r rBrr@r"r<)rr8r:r9r)rrprint_state_and_outputs    z(ConvolutionalCode.print_state_and_outputcCs~|dkr%|j||j}n|}t|jrh|jd|j|j||jd|jdk r|j||jd||jf|jd|j|jd|j |jd|j |jd||jd||j dk r|jd |j |j rJ|jd ||jd |t|jrm|jd |j|jddS) Nz#static const int %s_puncture[] = { z}; z&const struct osmo_conv_code %s_%s = { 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, ) rKrrrrBrArrErr r rr")rprefr8 shared_tables table_prefrrr gen_tabless0       zConvolutionalCode.gen_tablescCsa|j|j}|jdkr7||j|jd7}t|jr]|t|jd8}|S)Nr)r rrr rr)rout_lenrrr calc_out_lens zConvolutionalCode.calc_out_lencCs?d||jf}|jd|jd||jd||jd|j|jd|j|jdk r|jdk r|jd|jdt|jd d |d d |jd |jdt|jd d |d d |jd n'|jd|jd|jd|jddS)Nz%s_%sz { z .name = "%s", z .code = &%s, z .in_len = %d, z .out_len = %d, z .has_vec = 1, z .vec_in = { z0x%02x, indentz z }, z .vec_out = { z .has_vec = 0, z .vec_in = { }, z .vec_out = { }, z }, )rrBr rQrrr7)rr8prefix code_namerrrgen_test_vectors$        z!ConvolutionalCode.gen_test_vector)__name__ __module__ __qualname__r!propertyr"r#r(r)r1r2r3r4r<r@rArErKrOrQrVrrrrrs$  $      $ rcGstdd|DS)NcSsg|]}d|>qS)rr)rrrrrr s z..)rG)argsrrrrJsrJcs<||@dd}t|fddt|DS)NcSs||AS)Nr)rr rrrrJszcombine..csg|]}|?d@qS)rr)rrI)rrrr s zcombine..)rr6)r,selr'fn_xorr)rrr$s  r$cCsyd}|jdxR|D]J}|dkrI||dkrI|jd|j|||d7}qW|jddS)Nr z r )rB)r;formatcountr8counteritemrrrr7s   r7cCsCx<|jD].\}}td|d|}|j|q WdS)Nrr)r;rrK)r8 shared_polysrrcoderrr print_shared*srfcCsAtjj||}tjj|s4tj|t|dS)Nw)ospathjoinisdirmakedirsopen) parent_dir base_namerirrropen_for_writing0s rpcCst||}|jtd|jd|jdtjjdt|drit||jx|jD]~}tjjd|j d}t|drx3|jj D]"\}}|j |kr|}PqW|j ||d|qsWdS)Nr_z#include z #include z"Generating convolutional codes... rdzGenerate '%s' definition rM) rprB mod_licensesysstderrhasattrrfrd conv_codesrr;rrO)codesrirTrfresharedrrrrgenerate_codes6s   ryc Cst||}|jtd|dk rNx|D]}|jd|q3W|jd|jdtjjdt|j}|jd||f|jd||fx8|jD]-}tjjd|j|j||qW|jd dS) Nr_z%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}; ) rprBrqrrrsrrurrV) rvrirTrincrwrc vec_countrerrrgenerate_vectorsQs"      r|cCst||}|jtd|jd|jd|jd|dk r|jd||jd||jdtjjdxR|jD]G}tjjd |j|j|d |jd ||jfqWdS) Nr_z#pragma once z#include z #include z/*! \file %s.h z * %s z */ zGenerating header file... zGenerate '%s' declaration Tz+extern const struct osmo_conv_code %s_%s; )rprBrqrrrsrurrE)rvrirTrrrwrerrrgenerate_headerms      r}cCstj}|jdddddddg|jddd dd g|jd d dd |jdddd|jdddd|jS)Nactionhelpzwhat to generatechoices gen_codes gen_vectors gen_headerfamilyzconvolutional code familygsmz-pz--prefixzinternal naming prefixz-nz --target-nameztarget name for generated filez-Pz --target-pathztarget path for generated file)argparseArgumentParser add_argument parse_args)parserrrr parse_argvs    r__main__rgsm0503z #include rz_conv.crz_test_vectors.crz.hzGeneration complete. )!rqrrrhrr functoolsrconv_codes_gsmobjectrpolyr$r7rfrpryr|r}rrWargv target_pathgetcwdrirzrrvrTr~ target_namerrsrBrrrrs>0