summaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-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")