summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2016-10-29 00:00:57 +0700
committerHarald Welte <laforge@gnumonks.org>2016-12-24 17:12:49 +0000
commit6431adde78638db7dac0717f74de92ef8b491d73 (patch)
tree3f0b2d14c18161fcb4686003adff8a16df18aa75
parentc014f606d055bb0ab09b6b9128078cb7a4e06c4c (diff)
utils/conv_gen.py: use shared tables if possible
This change introduces the memory usage optimization, mentioned in d2d9760c08f35a231d32f0ebeb73b2927e5573b3. The aim is to make code generator able to detect, whether the same tables are used by several convolutional code definitions, and prevent one from writing these tables multiple times. For now, the detection process isn't fully automatic, so all shared polynomials should be placed inside the 'shared_polys' dictionary, for example: shared_polys = { "xcch" : [ ( G0, 1 ), ( G1, 1 ), ], "mcs" : [ ( G4, 1 ), ( G7, 1 ), ( G5, 1 ), ], } Change-Id: I84760f5cdfdaece376b801d2e6cb2954ee875a3b
-rw-r--r--utils/conv_gen.py98
1 files changed, 61 insertions, 37 deletions
diff --git a/utils/conv_gen.py b/utils/conv_gen.py
index 62fa8adb..1ecb550a 100644
--- a/utils/conv_gen.py
+++ b/utils/conv_gen.py
@@ -164,7 +164,7 @@ class ConvolutionalCode(object):
# Up to 12 numbers should be placed per line
print_formatted(self.puncture, "%3d, ", 12, fi)
- def gen_tables(self, pref, fi):
+ def print_state_and_output(self, fi):
pack = lambda n: \
sum([x << (self.rate_inv - i - 1) for i, x in enumerate(n)])
num_states = 1 << (self.k - 1)
@@ -186,6 +186,14 @@ class ConvolutionalCode(object):
self._print_term(fi, num_states, pack)
fi.write("};\n\n")
+ def gen_tables(self, pref, fi, shared_tables = None):
+ # Do not print shared tables
+ if shared_tables is None:
+ self.print_state_and_output(fi)
+ table_pref = self.name
+ else:
+ table_pref = shared_tables
+
if len(self.puncture):
fi.write("static const int %s_puncture[] = {\n" % self.name)
self._print_puncture(fi)
@@ -203,15 +211,15 @@ class ConvolutionalCode(object):
fi.write("\t.N = %d,\n" % self.rate_inv)
fi.write("\t.K = %d,\n" % self.k)
fi.write("\t.len = %d,\n" % self.block_len)
- fi.write("\t.next_output = %s_output,\n" % self.name)
- fi.write("\t.next_state = %s_state,\n" % self.name)
+ fi.write("\t.next_output = %s_output,\n" % table_pref)
+ fi.write("\t.next_state = %s_state,\n" % table_pref)
if self.term_type is not None:
fi.write("\t.term = %s,\n" % self.term_type)
if self.recursive:
- fi.write("\t.next_term_output = %s_term_output,\n" % self.name)
- fi.write("\t.next_term_state = %s_term_state,\n" % self.name)
+ fi.write("\t.next_term_output = %s_term_output,\n" % table_pref)
+ fi.write("\t.next_term_state = %s_term_state,\n" % table_pref)
if len(self.puncture):
fi.write("\t.puncture = %s_puncture,\n" % self.name)
@@ -239,6 +247,12 @@ def print_formatted(items, format, count, fi):
fi.write("\n")
+def print_shared(fi):
+ for (name, polys) in shared_polys.items():
+ # HACK
+ code = ConvolutionalCode(0, polys, name = name)
+ code.print_state_and_output(fi)
+
# Polynomials according to 3GPP TS 05.03 Annex B
G0 = poly(0, 3, 4)
G1 = poly(0, 1, 3, 4)
@@ -249,22 +263,23 @@ G5 = poly(0, 1, 4, 6)
G6 = poly(0, 1, 2, 3, 4, 6)
G7 = poly(0, 1, 2, 3, 6)
-CCH_poly = [
- ( G0, 1 ),
- ( G1, 1 ),
-]
-
-MCS_poly = [
- ( G4, 1 ),
- ( G7, 1 ),
- ( G5, 1 ),
-]
+shared_polys = {
+ "xcch" : [
+ ( G0, 1 ),
+ ( G1, 1 ),
+ ],
+ "mcs" : [
+ ( G4, 1 ),
+ ( G7, 1 ),
+ ( G5, 1 ),
+ ],
+}
conv_codes = [
# xCCH definition
ConvolutionalCode(
224,
- CCH_poly,
+ shared_polys["xcch"],
name = "xcch",
description = [
"xCCH convolutional code:",
@@ -277,7 +292,7 @@ conv_codes = [
# RACH definition
ConvolutionalCode(
14,
- CCH_poly,
+ shared_polys["xcch"],
name = "rach",
description = ["RACH convolutional code"]
),
@@ -285,7 +300,7 @@ conv_codes = [
# SCH definition
ConvolutionalCode(
35,
- CCH_poly,
+ shared_polys["xcch"],
name = "sch",
description = ["SCH convolutional code"]
),
@@ -293,7 +308,7 @@ conv_codes = [
# CS2 definition
ConvolutionalCode(
290,
- CCH_poly,
+ shared_polys["xcch"],
puncture = [
15, 19, 23, 27, 31, 35, 43, 47, 51, 55, 59, 63, 67, 71,
75, 79, 83, 91, 95, 99, 103, 107, 111, 115, 119, 123, 127, 131,
@@ -317,7 +332,7 @@ conv_codes = [
# CS3 definition
ConvolutionalCode(
334,
- CCH_poly,
+ shared_polys["xcch"],
puncture = [
15, 17, 21, 23, 27, 29, 33, 35, 39, 41, 45, 47, 51, 53,
57, 59, 63, 65, 69, 71, 75, 77, 81, 83, 87, 89, 93, 95,
@@ -579,7 +594,7 @@ conv_codes = [
# TCH_FR definition
ConvolutionalCode(
185,
- CCH_poly,
+ shared_polys["xcch"],
name = "tch_fr",
description = ["TCH/F convolutional code"]
),
@@ -724,7 +739,7 @@ conv_codes = [
# EDGE MCS1_DL_HDR definition
ConvolutionalCode(
36,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs1_dl_hdr",
term_type = "CONV_TERM_TAIL_BITING",
description = [
@@ -739,7 +754,7 @@ conv_codes = [
# EDGE MCS1_UL_HDR definition
ConvolutionalCode(
39,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs1_ul_hdr",
term_type = "CONV_TERM_TAIL_BITING",
description = [
@@ -754,7 +769,7 @@ conv_codes = [
# EDGE MCS1 definition
ConvolutionalCode(
190,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs1",
description = [
"EDGE MCS-1 data convolutional code:",
@@ -768,7 +783,7 @@ conv_codes = [
# EDGE MCS2 definition
ConvolutionalCode(
238,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs2",
description = [
"EDGE MCS-2 data convolutional code:",
@@ -782,7 +797,7 @@ conv_codes = [
# EDGE MCS3 definition
ConvolutionalCode(
310,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs3",
description = [
"EDGE MCS-3 data convolutional code:",
@@ -796,7 +811,7 @@ conv_codes = [
# EDGE MCS4 definition
ConvolutionalCode(
366,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs4",
description = [
"EDGE MCS-4 data convolutional code:",
@@ -810,7 +825,7 @@ conv_codes = [
# EDGE MCS5_DL_HDR definition
ConvolutionalCode(
33,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs5_dl_hdr",
term_type = "CONV_TERM_TAIL_BITING",
description = [
@@ -825,7 +840,7 @@ conv_codes = [
# EDGE MCS5_UL_HDR definition
ConvolutionalCode(
45,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs5_ul_hdr",
term_type = "CONV_TERM_TAIL_BITING",
description = [
@@ -840,7 +855,7 @@ conv_codes = [
# EDGE MCS5 definition
ConvolutionalCode(
462,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs5",
description = [
"EDGE MCS-5 data convolutional code:",
@@ -854,7 +869,7 @@ conv_codes = [
# EDGE MCS6 definition
ConvolutionalCode(
606,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs6",
description = [
"EDGE MCS-6 data convolutional code:",
@@ -868,7 +883,7 @@ conv_codes = [
# EDGE MCS7_DL_HDR definition
ConvolutionalCode(
45,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs7_dl_hdr",
term_type = "CONV_TERM_TAIL_BITING",
description = [
@@ -883,7 +898,7 @@ conv_codes = [
# EDGE MCS7_UL_HDR definition
ConvolutionalCode(
54,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs7_ul_hdr",
term_type = "CONV_TERM_TAIL_BITING",
description = [
@@ -898,7 +913,7 @@ conv_codes = [
# EDGE MCS7 definition
ConvolutionalCode(
462,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs7",
description = [
"EDGE MCS-7 data convolutional code:",
@@ -912,7 +927,7 @@ conv_codes = [
# EDGE MCS8 definition
ConvolutionalCode(
558,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs8",
description = [
"EDGE MCS-8 data convolutional code:",
@@ -926,7 +941,7 @@ conv_codes = [
# EDGE MCS9 definition
ConvolutionalCode(
606,
- MCS_poly,
+ shared_polys["mcs"],
name = "mcs9",
description = [
"EDGE MCS-9 data convolutional code:",
@@ -949,10 +964,19 @@ if __name__ == '__main__':
f.write(mod_license + "\n")
f.write("#include <stdint.h>\n")
f.write("#include <osmocom/core/conv.h>\n\n")
+ print_shared(f)
# Generate the tables one by one
for code in conv_codes:
sys.stderr.write("Generate '%s' definition\n" % code.name)
- code.gen_tables(prefix, f)
+
+ # Check whether shared polynomials are used
+ shared = None
+ for (name, polys) in shared_polys.items():
+ if code.polys == polys:
+ shared = name
+ break
+
+ code.gen_tables(prefix, f, shared_tables = shared)
sys.stderr.write("Generation complete.\n")