systems and methods for decoding a received codeword are provided. The received codeword is decoded based on a parity code to produce a plurality of checks. A first unsatisfied check is selected from the plurality of checks, and a first set of symbol positions in the received codeword that are connected to the first unsatisfied check is identified. A second set of symbol positions in the received codeword that are not connected to the first unsatisfied check is identified. The received codeword is modified by setting the first set of symbol positions to first predetermined values and by setting the second set of symbol positions to second predetermined values. The modified received codeword is decoded based on the parity code.
|
1. A method of decoding a received codeword, comprising:
decoding the received codeword based on a parity code to produce a plurality of checks;
selecting a first unsatisfied check from the plurality of checks;
identifying a first set of symbol positions in the received codeword connected to the first unsatisfied check;
identifying a second set of symbol positions in the received codeword not connected to the first unsatisfied check;
modifying the received codeword, the modifying comprising,
setting the first set of symbol positions to first predetermined values, and
setting the second set of symbol positions to second predetermined values; and
decoding the modified received codeword based on the parity code.
10. A system for decoding a received codeword, comprising:
a decoder configured to decode the received codeword or a modified received codeword based on a parity code, said decoding of the received codeword being configured to produce a plurality of checks;
a post-processor configured to perform operations including:
selecting a first unsatisfied check from the plurality of checks;
identifying a first set of symbol positions in the received codeword connected to the first unsatisfied check;
identifying a second set of symbol positions in the received codeword not connected to the first unsatisfied check;
modifying the received codeword, the modifying comprising,
setting the first set of symbol positions to first predetermined values, and
setting the second set of symbol positions to second predetermined values.
2. The method of
selecting a first symbol position from the first set of symbol positions;
selecting a second symbol position from the second set of symbol positions that is connected to a satisfied check, the satisfied check also being connected to the first symbol position;
setting the selected first and second symbol positions to signs opposite of those of corresponding symbol positions in the tentative codeword;
setting a remainder of the first and second sets of symbol positions to same signs as those of corresponding symbol positions in the tentative codeword.
3. The method of
a sign value for each symbol position of the received codeword;
an associated confidence value for each of the sign values, the associated confidence value being a log-likelihood ratio (LLR) value with a magnitude.
4. The method of
identifying symbol positions from the remainder of the first and second sets of symbol positions that have LLR magnitude values exceeding a first magnitude value;
for the identified symbol positions, setting the LLR magnitude values equal to the first magnitude value;
setting LLR magnitude values for the selected first symbol position and the selected second symbol position equal to a second magnitude value, the second magnitude value being greater than the first magnitude value.
5. The method of
setting LLR magnitude values for the remainder of the first and second sets of symbol positions equal to a first magnitude value;
setting LLR magnitude values for the selected first symbol position and the selected second symbol position equal to a second magnitude value, the second magnitude value being greater than the first magnitude value.
6. The method of
monitoring a number of unsatisfied checks before and after each decoding;
performing a further modification of the received codeword based on whether the number of unsatisfied checks before and after a particular decoding are equal.
7. The method of
building a table of error events associated with codewords;
performing a table lookup to determine if an error event associated with the received codeword or the modified received codeword is included in the table;
determining an actual codeword for the received codeword based on the table lookup.
8. The method of
executing, on the modified received codeword, one or more iterations of an iterative decoding algorithm, the method further comprising:
for each iteration of the iterative decoding algorithm, monitoring a number of unsatisfied checks, and
if the number of unsatisfied checks is determined to not be changing between iterations, exiting the iterative decoding algorithm.
9. The method of
11. The system of
selecting a first symbol position from the first set of symbol positions;
selecting a second symbol position from the second set of symbol positions that is connected to a satisfied check, the satisfied check also being connected to the first symbol position;
setting the selected first and second symbol positions to signs opposite of those of corresponding symbol positions in the tentative codeword;
setting a remainder of the first and second sets of symbol positions to same signs as those of corresponding symbol positions in the tentative codeword.
12. The system of
a sign value for each symbol position of the received codeword;
an associated confidence value for each of the sign values, the associated confidence value being a log-likelihood ratio (LLR) value with a magnitude.
13. The system of
identifying symbol positions from the remainder of the first and second sets of symbol positions that have LLR magnitude values exceeding a first magnitude value;
for the identified symbol positions, setting the LLR magnitude values equal to the first magnitude value;
setting LLR magnitude values for the selected first symbol position and the selected second symbol position equal to a second magnitude value, the second magnitude value being greater than the first magnitude value.
14. The system of
setting LLR magnitude values for the remainder of the first and second sets of symbol positions equal to a first magnitude value;
setting LLR magnitude values for the selected first symbol position and the selected second symbol position equal to a second magnitude value, the second magnitude value being greater than the first magnitude value.
15. The system of
monitoring a number of unsatisfied checks before and after each decoding;
performing a further modification of the received codeword based on whether the number of unsatisfied checks before and after a particular decoding are equal.
16. The system of
a table of error events associated with codewords, wherein the post-processor is further configured to perform operations including:
performing a table lookup using the table of error events to determine if an error event associated with the received codeword or the modified received codeword is included the table;
determining an actual codeword for the received codeword based on the table lookup.
17. The system of
executing, on the modified received codeword, one or more iterations of an iterative decoding algorithm, and wherein the decoder or post-processor is further configured to perform operations including:
for each iteration of the iterative decoding algorithm, monitoring a number of unsatisfied checks, and
if the number of unsatisfied checks is determined to not be changing between iterations, exiting the iterative decoding algorithm.
18. The system of
|
This application claims priority to U.S. Provisional Patent Application No. 61/540,110, filed Sep. 28, 2011, entitled “Message Biasing Post-Processing Methodologies in Decoding LDPC Codes,” which is herein incorporated by reference in its entirety. This application is related to U.S. patent application Ser. No. 12/327,627, filed Dec. 3, 2008, entitled “Post-Processing Decoder of LDPC Codes for Improved Error Floors,” and U.S. Provisional Application No. 60/991,905, filed Dec. 3, 2007, entitled “Post-Processing Decoder of LDPC Codes for Improved Error Floors,” the disclosure of both of which is herein incorporated by reference.
The technology described herein relates generally to decoding data and more particularly to decoding data using low-density parity check (LDPC) codes.
Transmission of information by a transmitter to a receiver may occur over a noisy communications channel. Because of the noisy communications channel, the receiver may receive a distorted version of the information originally transmitted by the transmitter. An example of a noisy communications channel may be a hard disk, where the hard disk accepts information from a “transmitter” (i.e., writer), stores the information, and then provides a distorted version of that information to a “receiver” (i.e., reader) when the information is accessed. The distortion caused by the hard disk may be great enough to cause a channel error, such that the receiver can receive erroneous information bits (i.e., the receiver may interpret a bit in an output signal as a 1 when a corresponding bit in the input signal was a 0, or vice versa). Channel errors may reduce throughput, cause data to be read incorrectly, and/or cause other undesirable events.
Low-density parity check (LDPC) coding is one method of detecting and correcting channel errors. LDPC codes are error-correcting codes that can be used to communicate information more reliably over a noisy communications channel. LDPC codes may provide error correction capabilities and enable the transmission of data at higher rates (e.g., rates that approach a theoretical maximum transmission rate of the channel).
The present disclosure is directed to systems and methods for decoding a received codeword. In a method for decoding a received codeword, the received codeword is decoded based on a parity code to produce a plurality of checks. A first unsatisfied check is selected from the plurality of checks, and a first set of symbol positions in the received codeword that are connected to the first unsatisfied check is identified. A second set of symbol positions in the received codeword that are not connected to the first unsatisfied check is identified. The received codeword is modified by setting the first set of symbol positions to first predetermined values and by setting the second set of symbol positions to second predetermined values. The modified received codeword is decoded based on the parity code.
In a system for decoding a received codeword, a decoder is configured to decode the received codeword or a modified received codeword based on a parity code. The decoding of the received codeword is configured to produce a plurality of checks. The system includes a post processor configured to perform operations including selecting a first unsatisfied check from the plurality of checks and identifying a first set of symbol positions in the received codeword connected to the first unsatisfied check. The post processor is further configured to select a second set of symbol positions in the received codeword not connected to the first unsatisfied check and to modify the received codeword. The modifying of the post processor includes the operations of setting the first set of symbol positions to first predetermined values and setting the second set of symbol positions to second predetermined values.
The present disclosure is further directed to another method for decoding a received codeword. In the method, the received codeword is decoded based on a low-density parity check code to produce a plurality of checks and a tentative codeword. The received codeword is modified, where the modifying includes identifying a cycle having a predetermined size, the cycle being a closed loop of a code graph produced as a result of decoding the received codeword and being connected to a first unsatisfied check from the plurality of checks. The modifying further includes setting one or more symbol positions of the cycle to signs opposite of those of corresponding symbol positions in the tentative codeword and setting a remainder of symbol positions of the received codeword to same signs as those of corresponding symbol positions in the tentative codeword. The modified received codeword is decoded based on the low-density parity check code.
The LDPC encoder 106 and modulator 110 prepare the information 104 for transmission through the channel 116 or storage in the channel 116. The LDPC encoder 106 encodes the information 104 to produce an LDPC codeword 108, such that the LDPC codeword 108 satisfies coding constraints of an LDPC code employed by the encoder 106. The LDPC code used by the encoder 106 may be selected to achieve particular communication or storage performance characteristics (e.g., a particular bit error rate). The modulator 110 converts the LDPC codeword 108 into an information-bearing signal 112 that is suitable for transmission through or storage in the channel 116. The modulator 110 may achieve the conversion using a variety of modulating techniques (e.g., pulse amplitude modulation, quadrature amplitude modulation, phase shift keying, or orthogonal frequency division multiplexing).
The channel 116 may be a noisy communications channel, such that the information-bearing signal 112 may be altered, distorted, and/or degraded when it is transmitted through or stored in the channel 116. A noisy information-bearing signal retrieved from the channel 116 may be substantially different from the information-bearing signal 112 that entered the channel 116, which may cause a receiver to receive erroneous bits of information (i.e., the receiver may interpret the output signal as a 1 when the input signal was a 0, or vice versa). To address the alteration, distortion, and/or degradation of the information-bearing signal 112, the system 100 includes an LDPC decoder 124 and an LDPC post-processor 126. These components are used to more accurately interpret the noisy information-bearing signal 118, in order to avoid the receipt of erroneous bits at the receiver.
A channel detector 120 is used to demodulate the noisy information-bearing signal 118 to produce a received codeword 122. The LDPC decoder 124 decodes the received codeword 122 using the same LDPC code employed by the encoder 106. The decoding of the LDPC decoder 124 produces an information estimate 128. An objective of the LDPC decoder 124 may be to produce the information estimate 128 that reproduces the information 104 that was input into the LDPC encoder 106. This may occur, for example, if there are sufficiently few errors in the received codeword 122. As discussed in further detail below, in situations where the LDPC decoder 124 cannot produce the information estimate 128 that reproduces the input information 104, the LDPC post-processor 126 is used to aid the decoder 124 in reaching the desired outcome.
The LDPC decoder 124 includes a check node update module 150 and a bit node update module 160. These modules 150, 160 are used to perform iterative decoding to process the received codeword 122 in the LDPC decoder 124 (e.g., via min-sum and sum-product iterative message passing algorithms). In one example, the check node update module 150 first computes a plurality of messages at a plurality of checks (i.e., check nodes) for the received codeword 122 using a parity check matrix of the LDPC code employed by the encoder 106 and decoder 124. Each of the plurality of checks is associated with one or more symbol positions (i.e., bits) of the received codeword 122 and each is an unsatisfied check or a satisfied check. A check may be unsatisfied when there is at least one symbol position associated with the check in the received codeword 122 that is erroneous. A check may be satisfied when there are no symbol positions associated with the check in the received codeword that are erroneous.
The plurality of messages associated with the plurality of parity checks for the received codeword 122 are be used to pass information on which of the plurality of checks are unsatisfied, such that the LDPC decoder 124 can make modifications to the received codeword 122 to produce the information estimate 128 that reproduces the original input information 104. Thus, the check node update module 150 passes the check node messages to the bit node update module 160, which updates and/or performs correction on the symbols of the received codeword 122 using the check node messages and original values of the received codeword 122. The bit node update module 160 produces and passes the updated bit messages to the check node update module 150, which allows the check node update module 150 to re-compute or update the values of the checks (i.e., determine again whether each of the plurality of checks is satisfied or unsatisfied).
The check node update module 150 and the bit node update module 160 perform a plurality of iterations in this manner, where each of the plurality of iterations cause the bit node update module 160 to come closer to producing a codeword that reproduces the codeword 108 originally received by the channel 116. In one example, the LDPC decoder 124 may be configured to run a predetermined number of iterations, such that if the original codeword 108 cannot be reproduced in the predetermined number of iterations, further iterations are not performed. Alternatively, the decoder 124 may discontinue performing iterations when a valid codeword satisfying coding constraints of the LDPC code is produced. The bits produced by the bit node update module 160 after the LDPC decoder terminates execution may be referred to collectively as a tentative codeword. The tentative codeword, in contrast to other output codewords described below, is produced as a result of operations of the LDPC decoder 124 only and does not rely on the LDPC post-processor 126.
The check node update module 150 and the bit node update module 160 may compute their respective messages using soft-information. The soft-information indicates likely values of the checks and/or symbol positions and a reliability or confidence value associated with each of the likely values (e.g., for an 8-bit codeword, the soft-information may indicate, for each of the eight symbol positions of the codeword, a value indicating whether the symbol position is a 0 or a 1 and an associated confidence value indicating a likelihood that the value is correct). The decoder 124 may calculate the soft-information in the form of a log-likelihood ratio (LLR) value for each check and/or symbol position. For example, the decoder may calculate LLR values for a transmitted or stored symbol position bit bi according to:
LLR(bi)=log((P(bi=0))/(P(bi=1)),
where P(bi=0) is a probability that the transmitted or stored bit is equal to 0, and P(bi=1) is a probability that the transmitted or stored bit is equal to 1. Using LLR values computed according to the above equation, a sign of the LLR value may indicate whether the transmitted or stored bit is more likely a zero or more likely a one (e.g., a negative LLR value may indicate a more likely one and a positive LLR value may indicate a more likely zero). The magnitude of the LLR value indicates the strength or confidence of the decoding, with higher magnitude values indicating a higher confidence. Checks may similarly be associated with soft-information that indicates how likely it is that the checks are satisfied or unsatisfied.
As noted above, in certain situations, the LDPC decoder 124 may not be able to produce a valid codeword that satisfies the coding constraints of the LDPC code employed by the LDPC encoder 106. This can occur where erroneous bits are located in symbol positions of the received codeword 122 that cause checks to reinforce, rather than correct, errors. For example, errors may remain after the LDPC decoder 124 performs a particular number of iterations when a number of erroneous bits in the received codeword 122 results in relatively few unsatisfied checks. In these situations involving relatively few unsatisfied checks, the set of erroneous symbols may be referred to as a near-codeword or a trapping set. Such near-codewords or trapping sets may be seen as being generally uncorrectable by the LDPC decoder, even after many iterations of an iterative decoding algorithm.
Referring briefly to
In the example trapping set 300 of
With reference again to
The LDPC decoder 224 includes a check node update module 250 and a bit node update module 260 that iteratively update check and bit nodes, respectively. Thus, in interpreting a noisy information-bearing signal in the system 200, two types of iterations are used: iterations between the SOVA module 220 and the LDPC decoder 224 and iterations within the LDPC decoder 224 that occur between the check node update module 250 and the bit node update module 260. For each iteration between the SOVA module 220 and the LDPC decoder 224 (i.e., an outer iteration), the check node and bit node update modules 250, 260 perform a plurality of message-passing iterations (i.e., inner iterations). In each inner iteration, the check node update module 250 uses LLR values computed by the SOVA module 220 in the outer iteration and also the LLR values provided by the bit node update module 260 in the inner iteration.
As described above with respect to
The multiplexer 225 may be controlled by the LDPC post-processor 226. Thus, in one example, the LDPC post-processor 226 controls the multiplexer 225 to select the output of the SOVA module 220 for all bits in an initial set of decoding iterations performed by the decoder 224. This enables the decoder 224 to compute the tentative codeword using a standard decoding process that does not involve altered inputs provided by the LDPC post-processor 226. If errors are present in the tentative codeword that prevent the actual codeword from being determined (e.g., a trapping set is present in the tentative codeword), the LDPC post-processor 226 controls the multiplexer 225 to select the output of the post-processor 226 for some of the symbol positions and to select the output of the SOVA module 220 for a remainder of the symbol positions. The extra iterations performed with the inputs altered by the LDPC post-processor 226 may prevent the decoder 224 from converging to the same, erroneous codeword.
In choosing a sign value for the symbol positions 302, 304, 306, the LDPC post-processor may use a sign of the original LLR value (i.e., a sign of the LLR values in the tentative codeword produced after an initial set of iterations executed by the decoder without assistance of the LDPC post-processor) for all but one of the symbol positions. Thus, in
Because the LDPC post-processor inverted a symbol position bit value that did not need to be inverted in the example of
Similarly, in
In
During biasing, symbol positions having LLR values that are biased (i.e., have their signs inverted) may receive a magnitude value that is much greater than the certain threshold magnitude value. Thus, in the example of
In
In both of the examples of
At 708, the modified received codeword is decoded using the LDPC code. Following this decoding, at 710, a second number of unsatisfied checks is determined. Thus, the first number of unsatisfied checks represent the syndrome weight prior to the LDPC post-processor's biasing procedure, and the second number of unsatisfied checks represent the syndrome weight after the biasing. At 712, the first number of unsatisfied checks are compared to the second number of unsatisfied checks to determine if they are equal. At 718, assuming that an actual codeword was not produced as a result of the first or second decoding procedures, the received codeword is further modified by the LDPC post-processor based on whether the first number of unsatisfied checks is equal to the second number of unsatisfied checks.
The method 700 of
If the error event associated with the received codeword is not included in the table, at 810, an LDPC post-processor performs a biasing procedure to modify the received codeword. The biasing procedure may be performed by the LDPC post-processor according to the techniques described above with respect to
If the error event associated with the modified received codeword is not included in the table, the process may return to 810, where another biasing procedure is performed on the modified received codeword. Subsequent table-lookup and biasing procedures may be performed until the actual codeword is determined. Table biasing may be performed after each biasing step because even though a previous error event may not have been found in the table, a subsequent error event may be. A size of the table may vary, and an effectiveness of implementing the table-lookup approach may depend on the table size. In one example, the table may be built with the most likely error events, rather than all possible error events up to a certain size. In another example, the table may be built to include all possible error events. In this example, generating the table may be time and memory consuming, but subsequent decoding may be performed quickly.
At 906, the LDPC decoder decodes the modified received codeword using one or more iterations of an iterative decoding process. At 908, a single iteration of the iterative decoding algorithm is performed. At 910, following the single iteration, a number of unsatisfied checks are monitored. At 912, a determination is made as to whether the number of unsatisfied checks is changing between iterations of the iterative decoding algorithm. If the number of unsatisfied checks is changing between iterations, the process returns to 908, where another single iteration of the iterative decoding algorithm is performed. If the number of unsatisfied checks is determined to not be changing between iterations, at 914, the iterative decoding algorithm is exited.
In this manner, the number of unsatisfied checks may be monitored for each particular decoding iteration of a given biasing step. In making the determination at 912 as to whether the number of unsatisfied checks is changing between iterations, the LDPC decoder may be configured to determine that the number of unsatisfied checks is not changing when the number of unsatisfied checks is the same in two, three, or four successive iterations, for example. Further, it may also be required that in addition to the number of unsatisfied checks not changing in two, three, or four iterations, the number of unsatisfied checks must also be below a certain threshold number. In one example, the threshold number of unsatisfied checks may be six or eight. Monitoring the number of unsatisfied checks may be used to eliminate iterations of the iterative decoding algorithm that may be unnecessarily performed after the algorithm has already converged to a particular syndrome. For example, the iterative decoding algorithm of the LDPC decoder may converge to and become stuck on a trapping set after a certain number of iterations, and exiting the decoding procedure at this point may be used to eliminate a number of iterations.
An example method of biasing based on cycles of LDPC code graphs may involve selecting a first symbol position to bias in a standard fashion. In the example of
The biasing techniques and decoding methods described above with respect to
While the disclosure has been described in detail and with reference to specific embodiments thereof, it will be apparent to one skilled in the art that various changes and modifications can be made therein without departing from the spirit and scope of the embodiments. Thus, it is intended that the present disclosure cover the modifications and variations of this disclosure provided they come within the scope of the appended claims and their equivalents.
It should be understood that as used in the description herein and throughout the claims that follow, the meaning of “a,” “an,” and “the” includes plural reference unless the context clearly dictates otherwise. Also, as used in the description herein and throughout the claims that follow, the meaning of “in” includes “in” and “on” unless the context clearly dictates otherwise. Further, as used in the description herein and throughout the claims that follow, the meaning of “each” does not require “each and every” unless the context clearly dictates otherwise. Finally, as used in the description herein and throughout the claims that follow, the meanings of “and” and “or” include both the conjunctive and disjunctive and may be used interchangeably unless the context expressly dictates otherwise; the phrase “exclusive of” may be used to indicate situations where only the disjunctive meaning may apply.
Varnica, Nedeljko, Zhang, Yifei, Burd, Gregory
Patent | Priority | Assignee | Title |
10009040, | Mar 25 2015 | Topcon Positioning Systems, Inc. | Method and apparatus for identification and compensation for inversion of input bit stream in LDPC decoding |
10868566, | Dec 14 2017 | Samsung Electronics Co., Ltd. | Error correction device, operating method of error correction device, and controller including error correction device |
9170877, | Jul 10 2012 | U S BANK NATIONAL ASSOCIATION, AS COLLATERAL AGENT | Resolving trapping sets |
Patent | Priority | Assignee | Title |
7191378, | Jul 03 2002 | DTVG LICENSING, INC | Method and system for providing low density parity check (LDPC) encoding |
7373585, | Jan 14 2005 | HAWAII, UNIVERSITY OF | Combined-replica group-shuffled iterative decoding for error-correcting codes |
7500172, | Feb 26 2005 | AVAGO TECHNOLOGIES INTERNATIONAL SALES PTE LIMITED | AMP (accelerated message passing) decoder adapted for LDPC (low density parity check) codes |
7627810, | Aug 29 2000 | Open Text SA ULC | Model for creating, inputting, storing and tracking multimedia objects |
20020010892, | |||
20050044475, | |||
20050193320, | |||
20070234184, | |||
20080126908, | |||
20080235559, | |||
20080244360, | |||
20080301517, | |||
20090313525, | |||
20100042890, | |||
20100042904, | |||
20100042905, | |||
20110078548, | |||
20110083058, | |||
20110311002, | |||
20130290806, |
Executed on | Assignor | Assignee | Conveyance | Frame | Reel | Doc |
Sep 25 2012 | VARNICA, NEDELJKO | MARVELL SEMICONDUCTOR, INC | ASSIGNMENT OF ASSIGNORS INTEREST SEE DOCUMENT FOR DETAILS | 029707 | /0383 | |
Sep 25 2012 | ZHANG, YIFEI | MARVELL SEMICONDUCTOR, INC | ASSIGNMENT OF ASSIGNORS INTEREST SEE DOCUMENT FOR DETAILS | 029707 | /0383 | |
Sep 27 2012 | Marvell International Ltd. | (assignment on the face of the patent) | / | |||
Jan 18 2013 | BURD, GREGORY | MARVELL SEMICONDUCTOR, INC | ASSIGNMENT OF ASSIGNORS INTEREST SEE DOCUMENT FOR DETAILS | 029707 | /0394 | |
Jan 21 2013 | MARVELL SEMICONDUCTOR, INC | MARVELL INTERNATIONAL LTD | ASSIGNMENT OF ASSIGNORS INTEREST SEE DOCUMENT FOR DETAILS | 029707 | /0397 |
Date | Maintenance Fee Events |
Sep 03 2018 | REM: Maintenance Fee Reminder Mailed. |
Feb 18 2019 | EXP: Patent Expired for Failure to Pay Maintenance Fees. |
Date | Maintenance Schedule |
Jan 13 2018 | 4 years fee payment window open |
Jul 13 2018 | 6 months grace period start (w surcharge) |
Jan 13 2019 | patent expiry (for year 4) |
Jan 13 2021 | 2 years to revive unintentionally abandoned end. (for year 4) |
Jan 13 2022 | 8 years fee payment window open |
Jul 13 2022 | 6 months grace period start (w surcharge) |
Jan 13 2023 | patent expiry (for year 8) |
Jan 13 2025 | 2 years to revive unintentionally abandoned end. (for year 8) |
Jan 13 2026 | 12 years fee payment window open |
Jul 13 2026 | 6 months grace period start (w surcharge) |
Jan 13 2027 | patent expiry (for year 12) |
Jan 13 2029 | 2 years to revive unintentionally abandoned end. (for year 12) |