B þfo.ã@sfdZddlZddlZddlZddlZddlmZddlZGdd„deƒZ dd„Z dd „Z d d „Z d d „Z dd„Zdd„Zd#dd„Zd$dd„Zdd„ZedkrbeƒZejp°e ¡ZdZejdkrÔeZejpÌdZdgZejdkrþejpìedZeeeeeƒnXejdkr,ejpedZeeeeeeƒn*ejd krVejpFed!Zeeeeeƒej  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´eZdZdgdddfdd„Zedd„ƒZedd„ƒZdd „Zd d „Zd%d d „Z d&dd„Z dd„Z dd„Z d'dd„Z d(dd„Zdd„Zd)dd„Zdd„Zd*dd „Zd!d"„Zd#d$„ZdS)+ÚConvolutionalCodeNc sî||_d|_||_t|ƒ|_||_||_||_||_||_ dd„|Dƒ|_ x6|D].\} } t |jt t  t  t | | ƒd¡¡ƒƒ|_qPW|jd|_d|_dd„|j Dƒ‰ˆrêt‡fdd„ˆDƒƒsÆtdƒ‚tdd„|Dƒƒsàtd ƒ‚ˆd |_dS) NécSs$g|]}|d|dkrdn|‘qS)rr)rr©)Ú.0Úxrrúb/home/osmocom-build/jenkins/workspace/osmo-gsm-tester_build-osmo-bts/libosmocore/utils/conv_gen.pyú -sz.ConvolutionalCode.__init__..écSs g|]}|ddkr|d‘qS)rr)rrrrrr 5scsg|]}|ˆdk‘qS)rr)rr)Úrprrr 7szCBad polynomials: Can't have multiple different divider polynomials!cSs$g|]}|ddkr|ddk‘qS)rrr)rrrrrr ;szUBad polynomials: Can't have a '1' divider with a non '1' dividend in a recursive coder)Ú block_lenÚkÚpunctureÚlenÚrate_invÚ term_typeÚvec_inÚvec_outÚnameÚ descriptionÚpolysÚmaxÚintÚmathÚfloorÚlogÚ poly_dividerÚallÚ ValueError) Úselfr rrrrrrrrÚyr)r rÚ__init__s* * zConvolutionalCode.__init__cCs |jdkS)Nr)r)rrrrÚ recursiveBszConvolutionalCode.recursivecCsd|jd>dS)Nr)r )rrrrÚ _state_maskFszConvolutionalCode._state_maskcCs*t|d>|B|j|jƒ}|d>|B|j@S)Nr)Úcombinerr r#)rÚstateÚbitÚnbrrrÚ next_stateJs  zConvolutionalCode.next_statecCs|d>|j@S)Nr)r#)rr%rrrÚnext_term_stateRsz!ConvolutionalCode.next_term_statec Csl|dkr| ||¡}|d@|d>B}g}x>|jD]4\}}|jrL|dkrL|}nt|||jƒ}| |¡q0W|S)Nr)r(rr"r$r Úappend) rr%r&ÚnsÚsrcÚrvÚp_nÚp_dÚorrrÚ next_outputUs zConvolutionalCode.next_outputcCsv|dkr| |¡}|d@|d>B}g}xJ|jD]@\}}|jrV|dkrVt||j|jƒ}nt|||jƒ}| |¡q.W|S)Nr)r)rr"r$rr r*)rr%r+r,r-r.r/r0rrrÚnext_term_outpuths z"ConvolutionalCode.next_term_outputcCs$| ||¡}|j|||d}||fS)N)r+)r(r1)rr%r&r+r'rrrÚnext{s zConvolutionalCode.nextcCs | |¡}|j||d}||fS)N)r+)r)r2)rr%r+r'rrrÚ next_term€s zConvolutionalCode.next_termFcCsPg}x8t|ƒD],}|r&|| |¡ƒ}n | |¡}| |¡qWt|dd|ƒdS)Nz%3d, é )Úranger2r)r*Úprint_formatted)rÚfiÚ num_statesÚpackÚitemsr%rrrrÚ _print_term…s zConvolutionalCode._print_termcCstg}x\t|ƒD]P}|r8|| |d¡ƒ}|| |d¡ƒ}n| |d¡}| |d¡}| ||f¡qWt|dd|ƒdS)Nrrz{ %2d, %2d }, é)r6r1r(r*r7)rr8r9r:r;r%Úx0Úx1rrrÚ_print_x“s  zConvolutionalCode._print_xcCst|jdd|ƒdS)Nz%3d, r5)r7r)rr8rrrÚ_print_puncture£sz!ConvolutionalCode._print_puncturecCsz|dkrD| d|jd¡xN|jdd…D]}| d|¡q,Wn(| d¡x|jD]}| d|¡qVW| d¡dS)NTz/*! structure describing %s. rrz * %s z/** z */ )Úwriter)rr8ÚbriefÚlinerrrÚprint_description§s  z#ConvolutionalCode.print_descriptioncsÀ‡fdd„}dˆjd>}| dˆj¡ˆ ||¡| d¡| dˆj¡ˆ |||¡| d¡ˆjr¼| dˆj¡ˆ ||¡| d¡| dˆj¡ˆ |||¡| d¡dS) Ncst‡fdd„t|ƒDƒƒS)Ncs"g|]\}}|ˆj|d>‘qS)r)r)rÚir)rrrr ¶szNConvolutionalCode.print_state_and_output....)ÚsumÚ enumerate)Ún)rrrÚµsz: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)rrÚprint_state_and_output´s      z(ConvolutionalCode.print_state_and_outputcCs&|dkr| |¡|j}n|}t|jƒrL| d|j¡| |¡| d¡|jdk r`| |¡| d||jf¡| d|j¡| d|j ¡| d|j ¡| d|¡| d|¡|j dk rÚ| d |j ¡|j rü| d |¡| d |¡t|jƒr| d |j¡| d¡dS) 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")rÚprefr8Ú shared_tablesÚ table_prefrrrÚ gen_tablesÊs0        zConvolutionalCode.gen_tablescCsJ|j|j}|jdkr*||j|jd7}t|jƒrF|t|jƒd8}|S)Nr)r rrr rr)rÚout_lenrrrÚ calc_out_lenîs    zConvolutionalCode.calc_out_lencCsòd||jf}| d¡| d|¡| d|¡| d|j¡| d| ¡¡|jdk rÆ|jdk rÆ| d¡| d¡t|jd d |d d | d ¡| d¡t|jd d |d d | d ¡n| d¡| d¡| d¡| d¡dS)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, éz )Úindentz }, z .vec_out = { z .has_vec = 0, z .vec_in = { }, z .vec_out = { }, z }, )rrBr rQrrr7)rr8ÚprefixÚ code_namerrrÚgen_test_vectorús$         z!ConvolutionalCode.gen_test_vector)N)N)F)F)F)N)Ú__name__Ú __module__Ú __qualname__r!Úpropertyr"r#r(r)r1r2r3r4r<r@rArErKrOrQrVrrrrrs$$        $ rcGstdd„|DƒƒS)NcSsg|] }d|>‘qS)rr)rrrrrr sz..)rG)ÚargsrrrrJórJcs,||@‰dd„}t|‡fdd„t|ƒDƒƒS)NcSs||AS)Nr)rr rrrrJr\zcombine..csg|]}ˆ|?d@‘qS)rr)rrI)rrrr szcombine..)rr6)r,Úselr'Úfn_xorr)rrr$sr$cCs^d}| d¡x@|D]8}|dkr6||dkr6| d¡| ||¡|d7}qW| d¡dS)Nrú z rÚ )rB)r;ÚformatÚcountr8ÚcounterÚitemrrrr7s    r7cCs2x,| ¡D] \}}td||d}| |¡q WdS)Nr)r)r;rrK)r8Ú shared_polysrrÚcoderrrÚ print_shared*srgcCs.tj ||¡}tj |¡s$t |¡t|dƒS)NÚw)ÚosÚpathÚjoinÚisdirÚmakedirsÚopen)Ú parent_dirÚ base_namerjrrrÚopen_for_writing0s  rqcCsºt||ƒ}| td¡| d¡| d¡tj d¡t|dƒrNt||jƒxf|jD]\}tj d|j ¡d}t|dƒr¢x&|j  ¡D]\}}|j |kr†|}Pq†W|j |||dqVWdS)Nr`z#include z #include z"Generating convolutional codes... rezGenerate '%s' definition )rM) rqrBÚ mod_licenseÚsysÚstderrÚhasattrrgreÚ conv_codesrr;rrO)ÚcodesrjrTrÚfrfÚsharedrrrrÚgenerate_codes6s          rzc CsÆt||ƒ}| td¡|dk r 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}; ) rqrBrrrsrtrrvrrV) rwrjrTrÚincrxrdÚ vec_countrfrrrÚgenerate_vectorsQs"         r}cCs¶t||ƒ}| td¡| d¡| d¡| d¡|dk rd| d|¡| d|¡| d¡tj d¡x@|jD]6}tj d |j¡| |d ¡| d ||jf¡qxWdS) 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; )rqrBrrrsrtrvrrE)rwrjrTrrrxrfrrrÚgenerate_headerms        r~cCsht ¡}|jdddddgd|jddd gd|jd d d d |jdddd |jdddd | ¡S)NÚactionzwhat to generateÚ gen_codesÚ gen_vectorsÚ gen_header)ÚhelpÚchoicesÚfamilyzconvolutional code familyÚgsmz-pz--prefixzinternal naming prefix)rƒz-nz --target-nameztarget name for generated filez-Pz --target-pathztarget path for generated file)ÚargparseÚArgumentParserÚ add_argumentÚ parse_args)ÚparserrrrÚ parse_argv†s rŒÚ__main__r†Úgsm0503z #include r€z_conv.crz_test_vectors.cr‚z.hzGeneration complete. )N)N)!rrrsrirr‡Ú functoolsrÚconv_codes_gsmÚobjectrÚpolyr$r7rgrqrzr}r~rŒrWÚargvÚ target_pathÚgetcwdrjr{r…rwrTrÚ target_namerrtrBrrrrÚs@  {